<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="content-type">
  <title>Hibernate Jpetstore &#20043;&#19977; &#25511;&#21046;&#23618;&#25216;&#26415;</title>
  <style>
pre {
padding: 5px;
border-style: solid;
border-width: 1px;
border-color: #CCCCCC;
background-color: #F4F4F4;
}
  </style>
</head>
<body>
<a name="1"></a>Hibernate JPetstore &#31995;&#21015;&#20043;&#19977;<br>
<h1>&#25511;&#21046;&#23618;&#25216;&#26415;</h1>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
By&nbsp; <a href="mailto:pzgyuanf@yahoo.com.cn">pprun</a><br>
<br>
<h2><a name="2"></a>&#25991;&#26723;&#20869;&#23481;</h2>
<div style="margin-left: 40px;">
<ul>
  <li><a href="#3">&#27010;&#35272;</a></li>
  <li><a href="#4">Spring &#24212;&#29992;&#19978;&#19979;&#25991;</a></li>
  <li><a href="#5">&#20381;&#36182;&#27880;&#20837;</a></li>
  <li><a href="#6">&#25318;&#25130;&#26426;</a></li>
  <ul>
    <li><a href="#6.1">Spring &#20869;&#32622;&#25903;&#25345;&#30340;&#20107;&#21153;&#22788;&#29702;&#25318;&#25130;&#26426;</a></li>
    <li><a href="#6.2">Spring &#33258;&#23450;&#25318;&#25130;&#26426;</a></li>
  </ul>
  <li><a href="#7">&#22768;&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;</a></li>
  <ul>
    <li><a href="#7.1">&#20107;&#21153;&#38548;&#31163;&#32423;&#21035;</a></li>
    <li><a href="#7.2">&#20107;&#21153;&#20256;&#25773;&#34892;&#20026;</a></li>
    <li><a href="#7.3">&#21482;&#35835;&#25552;&#31034;</a></li>
    <li><a href="#7.4">&#20107;&#21153;&#36229;&#26102;&#21608;&#26399;</a></li>
  </ul>
  <li><a href="#8">Actions &#21450; struts-config.xml</a></li>
  <ul>
    <li><a href="#8.1">BaseAction</a></li>
    <li><a href="#8.2">DoNothingAction</a></li>
    <li><a href="#8.3">ActionForm &lt;-- struts-config.xml --&gt; Action</a></li>
    <li><a href="#8.4">SecureBaseAction</a></li>
  </ul>
  <li><a href="#9">DAO&#25509;&#21475;&#35774;&#35745;&#21450;Hibernate DAO &#23454;&#29616;</a></li>
  <li><a href="#10">&#24635;&#32467;</a></li>
</ul>
</div>
<br>
<br>
<br>
<br>
<br>
&#22312;&#38405;&#35835;&#26412;&#31687;&#25991;&#31456;&#20043;&#21069;&#65292;&#35831;&#20808;&#20180;&#32454;&#38405;&#35835;&#21069;&#38754;&#31995;&#21015;&#30340;&#30456;&#20851;&#20869;&#23481;&#12290;<br>
<br>
&#20854;&#23454;&#22312;&#21457;&#20986;&#19978;&#23553;&#37038;&#20214;&#20043;&#21518;&#65292;&#25105;&#21457;&#29616;&#25105;&#36951;&#28431;&#20102;&#19968;&#20010;&#24456;&#22823;&#30340;&#20027;&#39064;&#27809;&#35762;&#65292;&#23601;&#26159;&#22312;&#21253;
org.springframework.samples.jpetstore.dao.hibernate
&#30340;&#23454;&#29616;&#20869;&#23481;&#12290;&#20294;&#26159;&#22240;&#20026;&#36825;&#20123;&#31867;&#30340;&#23454;&#29616;&#20005;&#26684;&#20381;&#36182; Spring &#30340; HibernateDaoSupport
&#31867;&#65292;&#20877;&#32773;&#30001;&#20110;&#19978;&#31687;&#25991;&#31456;&#23454;&#22312;&#22826;&#38271;&#20102;&#65292;&#25152;&#20197;&#20915;&#23450;&#25918;&#22312;&#36825;&#37324;&#26469;&#35762;&#12290;&#20294;&#26159;&#35831;&#21035;&#35823;&#20250;&#65292;&#36825;&#20010;&#21253;&#26159;&#23646;&#20110;&#25968;&#25454;&#23618;&#30340;&#20869;&#23481;&#65292;&#24182;&#19981;&#26159;&#25511;&#21046;&#23618;&#12290;<br>
<br>
<h2><a name="3"></a>&#27010;&#35272;</h2>
<div style="text-align: right;"><a href="#1"><small>&#22238;&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#22312;&#20256;&#32479;&#30340;&#22522;&#20110; Struts &#24212;&#29992;&#20013;&#65292;&#25152;&#35859;&#30340;&#25511;&#21046;&#23618;&#32452;&#20214;&#65292;&#33258;&#24049;&#38656;&#35201;&#20889;&#30340;&#37117;&#26080;&#38750;&#26159;&#19968;&#20123; Action&#65292;&#23545;&#20110;
ActionForm,&#20005;&#26684;&#22320;&#35762;&#65292;&#23427;&#26356;&#25509;&#36817;&#20110;&#34920;&#31034;&#23618;&#65292;&#20027;&#35201;&#29992;&#26469;&#23558;&#34920;&#31034;&#23618;&#30340;&#34920;&#21333;&#25968;&#25454;&#20256;&#36882;&#21040;&#25511;&#21046;&#23618;&#30340; Action&#12290;<br>
&#20294;&#26159;&#30001;&#20110;&#25105;&#20204;&#24341;&#20837;&#20102;Spring&#65292;&#25152;&#20197;&#24341;&#20837;&#20102;&#20381;&#36182;&#27880;&#20837;&#12289;&#25318;&#25130;&#26426;(AOP&#30340;&#33539;&#30068;&#65289;&#21450;&#22768;&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;&#12290;<br>
&#25152;&#20197;&#26412;&#31995;&#21015;&#30340;&#20869;&#23481;&#38500;&#20102;&#23558;&#19978;&#19968;&#31995;&#21015;&#36951;&#28431;&#30340; Dao &#30340; Hibernate &#23454;&#29616;&#34917;&#19978;&#20043;&#22806;&#65292;&#23601;&#26159;&#65306;<br>
&#20381;&#36182;&#27880;&#20837;&#12289;&#25318;&#25130;&#26426;&#12289;&#22768;&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;&#21450;Struts &#30340; Action.<br>
<br>
<br>
<h2><a name="4"></a>Spring &#24212;&#29992;&#19978;&#19979;&#25991;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
Spring &#20043;&#25152;&#20197;&#21448;&#21483; Bean &#21253;&#23481;&#22120;(container), &#23601;&#26159;&#22240;&#20026;&#23427;&#23384;&#22312;&#19968;&#20010;&#29305;&#27530;&#30340;&#37197;&#32622;&#25991;&#20214;
applicationContext.xml &#29992;&#26469;&#27880;&#20876;&#25152;&#26377; bean, &#36825;&#20123; bean
&#20250;&#22312;&#24212;&#29992;&#21152;&#36733;&#25110;&#24212;&#29992;&#37096;&#32626;&#23436;&#25104;&#21518;&#19968;&#21049;&#37027;&#23436;&#25104;&#21021;&#22987;&#21270;&#65292;&#38500;&#38750;&#20320;&#23558;&#26576;&#20010; bean
&#37197;&#32622;&#25104;&#8220;&#25042;&#21021;&#22987;&#21270;&#8221;(Lazily-instantiating)&#65292;&#40664;&#35748;&#30340;&#26159;&#25552;&#21069;&#21021;&#22987;&#21270; (eagerly pre-instantiate).&#35814;&#24773;&#35265;
Spring reference: 3.3.5. Lazily-instantiating beans<br>
<br>
&#25105;&#20204;&#23558; applicationContext.xml &#20840;&#37096;&#20869;&#23481;&#21015;&#20986;:<br>
<span class="921372908-18012007">
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br><br>&lt;!--<br>  - Application context definition for JPetStore's business layer.<br>  - Contains bean references to the transaction manager and to the DAOs in<br>  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").<br><br>    <span
 style="color: rgb(255, 0, 0);">Jpetstore &#30340;&#24212;&#29992;&#19978;&#19979;&#25991;&#23450;&#20041;&#65292;&#21253;&#21547;&#20107;&#21153;&#31649;&#29702;&#21644;&#24341;&#29992;&#20102;&#22312; dataAccessContext-local/jta.xml(&#20855;&#20307;&#20351;&#29992;&#20102;&#21738;&#20010;&#35201;&#30475; web.xml &#20013;&#30340; 'contextConfigLocation' &#30340;&#37197;&#32622;&#65289;&#20013;&#27880;&#20876;&#30340;DAO</span><br>--&gt;<br>&lt;beans xmlns="http://www.springframework.org/schema/beans"<br>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br>       xmlns:aop="http://www.springframework.org/schema/aop"<br>       xmlns:tx="http://www.springframework.org/schema/tx"<br>       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br>       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd<br>http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"&gt;<br>    <br>    <br>    &lt;!-- ========================= GENERAL DEFINITIONS ========================= --&gt;<br><br>    &lt;!-- Configurer that replaces ${...} placeholders with values from properties files <br>         <span
 style="color: rgb(255, 0, 0);">&#21344;&#20301;&#31526;&#30340;&#20540;&#23558;&#20174;&#21015;&#20986;&#30340;&#23646;&#24615;&#25991;&#20214;&#20013;&#25277;&#21462;&#20986;&#26469;</span><br>     --&gt;<br>    &lt;!-- (in this case, mail and JDBC related properties) --&gt;<br>    &lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br>        &lt;property name="locations"&gt;<br>            &lt;list&gt;<br>                &lt;value&gt;WEB-INF/mail.properties&lt;/value&gt;<br>                &lt;value&gt;WEB-INF/jdbc.properties&lt;/value&gt;<br>            &lt;/list&gt;<br>        &lt;/property&gt;<br>    &lt;/bean&gt;<br>    <br>    &lt;!-- MailSender used by EmailAdvice <br>         <span
 style="color: rgb(255, 0, 0);">&#25351;&#23450;&#29992;&#20110;&#21457;&#36865;&#37038;&#20214;&#30340; javamail &#23454;&#29616;&#32773;&#65292;&#36825;&#37324;&#20351;&#29992;&#20102; spring &#33258;&#24102;&#30340;&#23454;&#29616;&#12290;&#27492; bean &#23558;&#34987; emailAdvice &#20351;&#29992;</span><br>     --&gt;<br>    &lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;<br>        &lt;property name="host" value="${mail.host}"/&gt;<br>    &lt;/bean&gt;<br>    <br>    <br>    <br>    &lt;!-- ========================= BUSINESS OBJECT DEFINITIONS ======================== --&gt;<br><br>    &lt;!-- <span
 style="color: rgb(255, 0, 0);">&#19981;&#38656;&#35201;&#65292;&#22240;&#20026;&#34987; SpringMVC &#30340;&#23454;&#29616;&#20351;&#29992; </span>Generic validator for Account objects, to be used for example by the Spring web tier --&gt;<br>    &lt;bean id="accountValidator" class="org.springframework.samples.jpetstore.domain.logic.AccountValidator"/&gt;<br>    <br>    &lt;!-- <span
 style="color: rgb(255, 0, 0);">&#19981;&#38656;&#35201;&#65292;&#22240;&#20026;&#34987; SpringMVC &#30340;&#23454;&#29616;&#20351;&#29992;</span> Generic validator for Order objects, to be used for example by the Spring web tier --&gt;<br>    &lt;bean id="orderValidator" class="org.springframework.samples.jpetstore.domain.logic.OrderValidator"/&gt;<br>    <br>    &lt;!--<br>        <span
 style="color: rgb(255, 0, 0);">&#20027;&#35201;&#30340;&#21830;&#19994;&#36923;&#36753;&#23545;&#35937;&#65292;&#21363;&#25105;&#20204;&#25152;&#35828;&#30340;&#38376;&#38754;&#23545;&#35937;</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">        &#27880;&#20837;&#20102;&#25152;&#26377;&#30340;DAO&#65292;&#36825;&#20123;DAO&#26159;&#24341;&#29992;&#20102; dataAccessContext-xxx.xml &#20013;&#23450;&#20041;&#30340;DAO</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">        &#38376;&#38754;&#23545;&#35937;&#20013;&#30340;&#25152;&#26377;&#26041;&#27861;&#30340;&#20107;&#21153;&#25511;&#21046;&#23558;&#36890;&#36807;&#19979;&#38754;&#30340; aop:config &#26469;&#21152;&#20197;&#25511;&#21046;</span><br><br>      - JPetStore primary business object (default implementation).<br>      - Transaction advice gets applied through the AOP configuration below.<br>   --&gt;<br>    &lt;bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"&gt;<br>        &lt;property name="accountDao" ref="accountDao"/&gt;<br>        &lt;property name="categoryDao" ref="categoryDao"/&gt;<br>        &lt;property name="productDao" ref="productDao"/&gt;<br>        &lt;property name="itemDao" ref="itemDao"/&gt;<br>        &lt;property name="orderDao" ref="orderDao"/&gt;<br>    &lt;/bean&gt;<br>    <br>    <br>    &lt;!-- ========================= ASPECT CONFIGURATION ======================== --&gt;<br>    &lt;!-- <span
 style="color: rgb(255, 0, 0);">AOP&#37197;&#32622;&#65292;&#29992;&#26469;&#25511;&#21046;<big><big><span
 style="font-weight: bold;">&#21738;&#20123;</span></big></big>&#26041;&#27861;&#23558;&#38656;&#35201;&#36827;&#34892;&#20107;&#21153;&#22788;&#29702;&#65292;&#37319;&#29992;&#20102;AspectJ &#30340;&#35821;&#27861;</span> --&gt;<br>    &lt;aop:config&gt;<br>        &lt;!--<br>        This definition creates auto-proxy infrastructure based on the given pointcut,<br>        expressed in AspectJ pointcut language. Here: applying the advice named<br>        "txAdvice" to all methods on classes named PetStoreImpl.<br>    --&gt;<br>        &lt;!-- <span
 style="color: rgb(255, 0, 0);">&#25351;&#20986;&#22312; PetStoreFacade &#30340;&#25152;&#26377;&#26041;&#27861;&#37117;&#23558;&#37319;&#29992; txAdvice(&#22312;&#32039;&#25509;&#30528;&#30340;&#20803;&#32032;&#20013;&#23450;&#20041;&#20102;&#65289;&#20107;&#21153;&#26041;&#38024;&#65292;&#27880;&#24847;&#65292;&#25105;&#20204;&#36825;&#37324;&#34429;&#28982;&#25351;&#23450;&#30340;&#26159;&#25509;&#21475; PetStoreFacace, &#20294;&#20854;&#26263;&#31034;&#30528;&#20854;&#25152;&#26377;&#30340;&#23454;&#29616;&#31867;&#20063;&#23558;</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#21516;&#26679;&#20855;&#26377;&#36825;&#31181;&#24615;&#36136;&#65292;&#22240;&#20026;&#26412;&#36523;&#23601;&#26159;&#23454;&#29616;&#31867;&#30340;&#26041;&#27861;&#22312;&#25191;&#34892;&#30340;&#65292;&#25509;&#21475;&#26159;&#27809;&#26377;&#26041;&#27861;&#20307;&#30340;&#12290;</span> --&gt;<br>        &lt;aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/&gt;<br>        <br>        &lt;!--<br>            This definition creates auto-proxy infrastructure based on the given pointcut,<br>            expressed in AspectJ pointcut language. Here: applying the advice named<br>            "emailAdvice" to insertOrder(Order) method of PetStoreImpl<br>    --&gt;<br>        &lt;!-- <span
 style="color: rgb(255, 0, 0);">&#24403;&#25191;&#34892; PetStoreFacade.insertOrder&#26041;&#27861;&#65292;&#35813;&#26041;&#27861;&#26368;&#21518;&#19968;&#20010;&#21442;&#25968;&#20026;Order&#31867;&#22411;&#26102;&#65288;&#20854;&#23454;&#25105;&#20204;&#30340;&#20363;&#23376;&#20013;&#21482;&#26377;&#19968;&#20010; insertOrder &#26041;&#27861;&#65292;&#20294;&#36825;&#21578;&#35785;&#20102;&#25105;&#20204;&#65292;&#24403;&#25105;&#20204;&#30340;&#25509;&#21475;&#25110;&#31867;&#20013;&#26377;&#37325;&#36733;&#20102;&#30340;&#26041;&#27861;&#65292;</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#24182;&#19988;&#21508;&#20010;&#37325;&#36733;&#30340;&#26041;&#27861;&#21487;&#33021;&#20351;&#29992;&#19981;&#21516;&#30340;&#25318;&#25130;&#26426;&#26426;&#21046;&#26102;&#65292;&#25105;&#20204;&#21487;&#20197;&#36890;&#36807;&#26041;&#27861;&#30340;&#21442;&#25968;&#21152;&#20197;&#25351;&#23450;&#65289;&#65292;&#23558;&#25191;&#34892;emailAdvice(&#22312;&#26368;&#21518;&#23450;&#20041;&#30340;&#37027;&#20010;&#20803;&#32032;&#65289;</span>--&gt;<br>        &lt;aop:advisor pointcut="execution(* *..PetStoreFacade.insertOrder(*..Order))" advice-ref="emailAdvice"/&gt;<br>        <br>    &lt;/aop:config&gt;<br>    <br>    &lt;!--<br>&#12288;&#12288;&#12288;&#12288;&#12288;<br>        <span
 style="color: rgb(255, 0, 0);">&#20107;&#21153;&#26041;&#38024;&#22768;&#26126;&#65292;&#29992;&#20110;&#25511;&#21046;&#37319;&#29992;<big
 style="font-weight: bold;"><big>&#20160;&#20040;&#26679;</big></big>&#30340;&#20107;&#21153;&#31574;&#30053;</span><br>        Transaction advice definition, based on method name patterns.<br>        Defaults to PROPAGATION_REQUIRED for all methods whose name starts with<br>        "insert" or "update", and to PROPAGATION_REQUIRED with read-only hint<br>        for all other methods.<br>    --&gt;<br>    &lt;tx:advice id="txAdvice"&gt;<br>        &lt;tx:attributes&gt;<br>            &lt;tx:method name="insert*"/&gt;<br>            &lt;tx:method name="update*"/&gt;<br>            &lt;tx:method name="*" read-only="true"/&gt;<br>        &lt;/tx:attributes&gt;<br>    &lt;/tx:advice&gt;<br>    <br><br>    &lt;!-- <span
 style="color: rgb(255, 0, 0);">&#25318;&#25130;&#26426;&#65292;&#29992;&#20110;&#22312;&#36866;&#24403;&#30340;&#26102;&#26426;(&#36890;&#36807;AOP&#37197;&#32622;&#65292;&#22914;&#19978;&#38754;)&#22312;&#26041;&#27861;&#25191;&#34892;&#25104;&#21151;&#21518;&#21457;&#36865;&#37038;&#20214;</span><br>&nbsp;     AOP advice used to send confirmation email after order has been submitted --&gt;<br>    &lt;!-- --&gt;<br>    &lt;bean id="emailAdvice" class="org.springframework.samples.jpetstore.domain.logic.SendOrderConfirmationEmailAdvice"&gt;<br>        &lt;property name="mailSender" ref="mailSender"/&gt;<br>    &lt;/bean&gt;<br>    <br>    <br>    &lt;!-- ========================= <span
 style="color: rgb(255, 0, 0);">&#24573;&#30053;</span> REMOTE EXPORTER DEFINITIONS ======================== --&gt;<br><br>    <br>&lt;/beans&gt;</pre>
</span><br>
&#20808;&#31895;&#30053;&#22320;&#30475;&#30475;<span style="color: rgb(255, 0, 0);">&#32418;&#33394;</span>&#30340;&#27880;&#37322;&#21644;&#30456;&#20851;&#30340;&#37197;&#32622;&#65292;&#19979;&#38754;&#23558;&#19968;&#19968;&#20171;&#32461;&#12290;<br>
<br>
<br>
<h2><a name="5"></a>&#20381;&#36182;&#27880;&#20837;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#20381;&#36182;&#27880;&#20837; DI (<span style="font-weight: bold;">D</span>ependency <span
 style="font-weight: bold;">I</span>njection )&#65292;&#21448;&#20570;&#21453;&#36716;&#25511;&#21046; IoC (<span
 style="font-weight: bold;">I</span>nversion <span
 style="font-weight: bold;">o</span>f <span style="font-weight: bold;">C</span>ontrol)&#12290;
&#19981;&#31649;&#36825;&#20123;&#27010;&#24565;&#22914;&#20309;&#65292;&#25105;&#20204;&#29992;&#26368;&#31616;&#21333;&#30340;&#25991;&#23383;&#21644;&#20363;&#23376;&#21152;&#20197;&#25551;&#36848;&#65292;&#30465;&#24471;&#36153;&#24515;&#21435;&#29702;&#35299;&#19968;&#22823;&#22534;&#38476;&#29983;&#30340;&#27010;&#24565;&#12290;<br>
<br>
<br>
&#30001;&#20110;&#25105;&#20204;&#30340;&#38376;&#38754;&#23454;&#29616;&#31867;&#20013;&#35201;&#27719;&#38598;&#25152;&#26377;&#30340;DAO&#65292;&#35201;&#35843;&#29992;DAO&#30340;&#26041;&#27861;&#65292;&#24403;&#28982;&#39318;&#20808;&#38656;&#35201;&#33719;&#24471;DAO&#30340;&#23454;&#20363;&#23545;&#35937;&#12290;&#26082;&#28982;&#25105;&#20204;&#30693;&#36947;&#19968;&#23450;&#20250;&#29992;&#21040;DAO&#30340;&#23454;&#20363;&#23545;&#35937;&#65292;&#37027;&#20040;&#65292;&#20256;
&#32479;&#30340;&#26041;&#24335;&#32943;&#23450;&#19981;&#22806;&#20046;<br>
&#22312; <span style="font-family: monospace;">PetStoreImpl </span>&#20013;<br>
<span class="921372908-18012007">
<pre>AccountDao accountDao = new HibernateAccountDao(...);</pre>
</span>&#36825;&#26159;&#20256;&#32479;&#30340;&#20381;&#36182;&#26041;&#24335;&#65292;&#21363; PetStoreImpl &#20381;&#36182;&#20110; AccountDao&#65292;&#36825;&#31181;&#20256;&#32479;&#30340;&#20381;&#36182;&#26041;&#24335;&#26377;&#20160;&#20040;&#19981;&#22909;&#65311;<br>
&#22240;&#20026;&#20026;&#20102;&#21021;&#22987;&#21270;&#19968;&#20010;&#31867;&#65292;&#34429;&#28982; &#23545;&#31867;&#22411;&#30340;&#22768;&#26126;&#21487;&#20197;&#26159;&#25509;&#21475;&#25110;&#25277;&#35937;&#31867;&#65292;&#22914;&#25105;&#20204;&#30340; AccountDao &#27491;&#22909;&#26159;&#20010;&#25509;&#21475;&#65292;&#20294; new &#21518;&#38754;&#27704;&#36828;&#21482;&#33021;&#26159;
&#20855;&#20307;&#30340;&#23454;&#29616;&#31867; (concrete class),
&#19981;&#21487;&#33021;&#26159;&#25277;&#35937;&#31867;&#25110;&#25509;&#21475;&#12290;&#36825;&#35828;&#26126;&#20102;&#20160;&#20040;&#65311;&#36825;&#35828;&#26126;&#20102;&#24403;&#20174;&#19968;&#31181;&#23454;&#29616;&#20999;&#25442;&#21040;&#21478;&#19968;&#31181;&#23454;&#29616;&#26102;&#65292;&#20320;&#20173;&#28982;&#19981;&#24471;&#19981;&#20462;&#25913;&#36825;&#27573;&#20195;&#30721;&#12290;&#22914;&#29616;&#22312;&#24819;&#25552;&#39640;&#24615;&#33021;&#65292;&#37325;&#26032;&#29992;JDBC&#23454;&#29616;&#20102;&#19968;&#22871;
DAO&#65292;JdbcAccountDao, &#37027;&#20040;&#20174; HibernateAccountDao&#12288;&#25442;&#21040; JdbcAccountDao, &#25105;&#20204;&#38656;&#35201;&#36825;&#26679;&#20570;&#65306;<br>
<span class="921372908-18012007">
<pre>AccountDao accountDao = new <span style="color: rgb(255, 0, 0);">JdbcAccountDao</span>(...);</pre>
</span>&#34429;&#28982;&#24037;&#21378;&#26041;&#27861;&#21487;&#20197;&#20943;&#36731;&#36825;&#31181;&#24433;&#21709;&#65292;&#23558;&#25913;&#21464;&#38598;&#20013;&#21040;&#24037;&#21378;&#26041;&#27861;&#20043;&#20013;&#65292;&#20294;&#26159;&#19968;&#20010;&#31867;&#35201;&#24819;&#34987;&#26500;&#36896;&#20986;&#26469;&#65292;&#22312;&#26222;&#36890;&#30340; Java &#20195;&#30721;&#20013;&#31163;&#19981;&#24320; new
&#20851;&#38190;&#23383;&#12290;<br>
<br>
&#25152;&#20197;&#20381;&#36182;&#27880;&#20837;&#30340;&#20513;&#23548;&#32773;&#35748;&#20026;&#65292;&#26082;&#28982;&#25105;&#20204;&#30693;&#36947; PetStoreImpl &#19968;&#23450;&#20250;&#29992;&#21040; AccountDao&#65292;&#25105;&#20204;&#19981;&#22914;&#35753; AccountDao &#27880;&#20837;&#21040;
PetStoreImpl
&#20013;&#65292;&#20309;&#24517;&#35201;&#31561;&#21040;&#35201;&#29992;&#26102;&#65292;&#25165;&#23558;&#20854;&#21021;&#22987;&#20986;&#26469;&#21602;&#65311;&#36825;&#23601;&#21407;&#34892;&#30340;&#39034;&#24207;&#20381;&#36182;&#20498;&#36807;&#26469;&#20102;&#65306;&#34987;&#20381;&#36182;&#30340;&#23545;&#35937;&#33258;&#24049;&#21021;&#22987;&#21270;&#22909;&#20102;&#24182;&#19988;&#27880;&#20837;&#21040;&#20381;&#36182;&#20110;&#23427;&#30340;&#23545;&#35937;&#20013;&#26469;&#12290;&#36825;&#23601;&#26159;&#20381;&#36182;&#27880;&#20837;&#25110;&#21453;&#36716;
&#25511;&#21046;&#30340;&#30001;&#26469;&#12290;<br>
&#20294;&#26159;&#65292;&#25105;&#30693;&#36947;&#20219;&#20309;&#19996;&#35199;&#37117;&#26377;&#21033;&#24517;&#26377;&#24330;&#65306;&#20381;&#36182;&#27880;&#20837;&#26377;&#26102;&#20250;&#26174;&#24471;&#28010;&#36153;&#65292;&#22914;&#26524;&#25972;&#20010;&#24212;&#29992;&#30340;&#29983;&#21629;&#21608;&#26399;&#20869;&#26681;&#26412;&#27809;&#26377;&#29992;&#21040;&#36825;&#20010;&#31867;&#65292;&#37027;&#20010;&#23427;&#30340;&#21021;&#22987;&#21270;&#21450;&#28010;&#36153;&#22312;&#21152;&#36733;&#26102;&#30340;&#26102;&#38388;&#23601;&#26174;&#31034;&#22810;
&#20313;&#20102;&#12290;&#20294;&#26159;&#65292;&#36825;&#20123;&#25439;&#22833;&#23545;&#20110;&#26381;&#21153;&#22120;&#31471;&#30340;&#31243;&#24207;&#26469;&#35762;&#36824;&#26159;&#21487;&#20197;&#24525;&#21463;&#65292;&#21482;&#26159;&#23545;&#20110;&#23458;&#25143;&#31471;&#30340;&#31243;&#24207;&#26377;&#20123;&#19981;&#36866;&#21512;&#12290;&#27604;&#22914;&#25105;&#20204;&#30340;IDE&#65292;&#21551;&#21160;&#35201;&#37027;&#20040;&#38271;&#26102;&#38388;&#65292;&#23601;&#26159;&#22240;&#20026;&#27599;&#27425;&#37117;&#21152;&#36733;&#20102;
&#25152;&#26377;&#30340;&#19996;&#35199;&#65292;&#20294;&#20854;&#23454;&#25105;&#20204;&#21482;&#24819;&#29992;&#23427;&#25171;&#24320;&#19968;&#20010;&#28304;&#25991;&#20214;&#65292;&#30475;&#23436;&#23601;&#20851;&#20102;&#32610;&#20102;&#12290;<br>
&#20294;&#26159;&#25105;&#20204;&#21069;&#38754;&#25552;&#21040;&#20102;&#65292;&#8220;&#25042;&#21152;&#36733;&#8221;&#23601;&#26159;&#20026;&#20102;&#35299;&#20915;&#36825;&#19968;&#38382;&#39064;&#30340;&#12290;<br>
<br>
&#19979;&#38754;&#25105;&#20204;&#30475;&#30475;&#39033;&#30446;&#30340;&#20381;&#36182;&#27880;&#20837;&#30340;&#20363;&#23376;&#65306;<br>
PetStoreImpl.java:<br>
<span class="921372908-18012007">
<pre>public class PetStoreImpl implements PetStoreFacade, OrderService {<br><br>  // <span
 style="color: rgb(255, 0, 0);">&#20197;&#19979;&#26159;&#25152;&#20381;&#36182;&#30340;DAO </span> <br>  private AccountDao accountDao;<br>  <br>  private CategoryDao categoryDao;<br>  <br>  private ProductDao productDao;<br>  <br>  private ItemDao itemDao;<br>  <br>  private OrderDao orderDao;<br>  <br>  //-------------------------------------------------------------------------<br>  // Setter methods for dependency injection<br>  // <span
 style="color: rgb(255, 0, 0);">&#25105;&#20204;&#37319;&#29992;&#30340;&#26159;&#22522;&#20110; Setter &#26041;&#27861;&#30340;&#27880;&#20837;&#26041;&#24335;</span><br>  //-------------------------------------------------------------------------<br>  <br>  public void setAccountDao(AccountDao accountDao) {<br>    this.accountDao = accountDao;<br>  }<br>  <br>  public void setCategoryDao(CategoryDao categoryDao) {<br>    this.categoryDao = categoryDao;<br>  }<br>  <br>  public void setProductDao(ProductDao productDao) {<br>    this.productDao = productDao;<br>  }<br>  <br>  public void setItemDao(ItemDao itemDao) {<br>    this.itemDao = itemDao;<br>  }<br>  <br>  public void setOrderDao(OrderDao orderDao) {<br>    this.orderDao = orderDao;<br>  }</pre>
</span><br>
&#20195;&#30721;&#24212;&#35813;&#22909;&#31616;&#21333;&#65292;&#22768;&#26126;&#19968;&#20010; private &#30340;&#20381;&#36182;&#30340;&#23545;&#35937;&#65292;&#25552;&#20379;&#19968;&#20010;&#23545;&#24212;&#30340; setter &#26041;&#27861;&#65292;&#21097;&#19979;&#30340;&#20107;&#24773;&#23601;&#26159;&#37197;&#32622;&#20102;&#65306;<br>
<br>
applicationContext.xml &#25991;&#20214;&#20013;&#65306;&#23545;&#27599;&#20010;&#31169;&#26377;&#30340;&#25104;&#21592;&#23545;&#24212;&#26377;&#19968;&#20010; &lt;property name="&#25104;&#21592;&#30340;&#21517;&#31216;"&gt;&#65292;
ref= &#21578;&#35785; Spring &#36825;&#20010;&#25104;&#21592;&#30340;&#23454;&#20363;&#26159;&#24341;&#29992;&#20854;&#23427;&#22320;&#26041;&#37197;&#32622;&#30340; bean, &#22914;&#26524;&#19981;&#26159;&#22312;&#20854;&#23427;&#22320;&#26041;&#37197;&#32622;&#30340;&#65292;&#36825;&#37324;&#21487;&#20197;&#30452;&#25509;&#25552;&#20379;&#19968;&#20010;
value="org.springframework.samples.jpetstore.dao.hibernate.HibernateAccountDao",
&#23545;&#20110;&#20854;&#23427;&#31867;&#22411;&#30340;&#23646;&#24615;&#65292;&#22914;&#38598;&#21512;&#31867;&#22411;&#30340;&#23646;&#24615;&#30340;&#20540;&#30340;&#35774;&#32622;&#65292;&#35831;&#21442;&#35265; Spring reference: 3.3.3. Bean properties
and constructor arguments detailed<br>
<br>
<span class="921372908-18012007">
<pre>    &lt;bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"&gt;<br>        &lt;property name="accountDao" ref="accountDao"/&gt;<br>        &lt;property name="categoryDao" ref="categoryDao"/&gt;<br>        &lt;property name="productDao" ref="productDao"/&gt;<br>        &lt;property name="itemDao" ref="itemDao"/&gt;<br>        &lt;property name="orderDao" ref="orderDao"/&gt;<br>    &lt;/bean&gt;</pre>
</span><br>
dataAccessContext-hibernate.xml &#25991;&#20214;&#20013;&#65306;&#35813;&#25991;&#20214;&#20013;&#37197;&#32622;&#20102;&#25152;&#26377;&#30340; DAO&#30340;&#23454;&#29616;&#31867;.<br>
&#20540;&#24471;&#27880;&#24847;&#30340;&#26159;&#65292;&#27599;&#20010;DAO&#30340;&#23454;&#29616;&#31867;&#21448;&#38656;&#35201;&#19968;&#20010; sessionFactory Bean, &#36825;&#20010;&#37325;&#37327;&#32423;&#30340;bean &#21516;&#26679;&#26159;&#22312;&#27492;&#25991;&#20214;&#20013;&#23450;&#20041;&#20102;&#12290;<br>
<span class="921372908-18012007">
<pre>  &lt;bean id="accountDao" class="org.springframework.samples.jpetstore.dao.hibernate.HibernateAccountDao"&gt;<br>    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br>  &lt;/bean&gt;<br>  <br>  &lt;bean id="categoryDao" class="org.springframework.samples.jpetstore.dao.hibernate.HibernateCategoryDao"&gt;<br>    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br>  &lt;/bean&gt;<br>  <br>  &lt;bean id="productDao" class="org.springframework.samples.jpetstore.dao.hibernate.HibernateProductDao"&gt;<br>    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br>  &lt;/bean&gt;<br>  <br>  &lt;bean id="itemDao" class="org.springframework.samples.jpetstore.dao.hibernate.HibernateItemDao"&gt;<br>    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br>  &lt;/bean&gt;<br>  <br>  &lt;bean id="orderDao" class="org.springframework.samples.jpetstore.dao.hibernate.HibernateOrderDao"&gt;<br>    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br>  &lt;/bean&gt;</pre>
</span>&#22914;&#26524;&#20320;&#32454;&#24515;&#30340;&#35805;&#65292;&#20320;&#20250;&#21457;&#29616;&#65292;&#22312;&#25152;&#26377;&#30340;Hibernate &#23454;&#29616;&#30340;DAO&#20013;&#65292;&#26681;&#26412;&#19981;&#23384;&#22312;:<br>
<span class="921372908-18012007">
<pre>private SessionFactory sessionFactory;<br><br>public final void setSessionFactory(SessionFactory sessionFactory) {<br>	this.sessionFactory = sessionFactory;<br>}<br></pre>
</span>&#20294;&#26159;&#65292;&#25105;&#20204;&#30475;&#30475;&#65292;&#25152;&#26377;&#30340;&#36825;&#20123;&#31867;&#37117;&#26159;&#20174; <span style="font-family: monospace;">org.springframework.orm.hibernate3.support.HibernateDaoSupport
&#27966;&#29983;&#36807;&#26469;&#30340;&#65292;&#36339;&#21040;&#23427;&#30340;&#28304;&#30721;&#65292;&#25105;&#20204;&#21487;&#20197;&#30475;&#21040;&#65306;<br>
<br>
</span><span class="921372908-18012007">
<pre>	private HibernateTemplate hibernateTemplate;<br><br><br>	/**<br>	 * Set the Hibernate SessionFactory to be used by this DAO.<br>	 * Will automatically create a HibernateTemplate for the given SessionFactory.<br>	 * @see #createHibernateTemplate<br>	 * @see #setHibernateTemplate<br>	 */<br>	public final void setSessionFactory(SessionFactory sessionFactory) {<br>	  this.hibernateTemplate = createHibernateTemplate(sessionFactory);<br>	}</pre>
</span><br>
&#22312; Spring &#20013; <span style="font-family: monospace;">HibernateTemplate
&#25198;&#28436;&#30528;&#19982; Hibernate &#30340; SessionFactory.getCurrentSession()&#21516;&#26679;&#30340;&#35282;&#33394;&#65292;&#21363;&#33719;&#24471;&#19968;&#27425;&#25968;&#25454;&#24211;&#20250;&#35805;&#65292;&#19982;
JDBC &#30340; DriverManager.getConnection(...) &#26377;&#24322;&#26354;&#21516;&#24037;&#20043;&#25928;&#12290;<br>
&#25152;&#20197;&#19978;&#38754;&#30340;&#20195;&#30721;&#26159;&#30495;&#27491;&#25226; sessionFactory &#27880;&#20837;&#21040;&#20102; HibernateDaoSupport &#31867;&#20013;&#20102;&#65292;&#20063;&#21363;&#26159;&#25152;&#26377; Hibernate
DAO &#30340;&#36229;&#31867;&#20013;&#20102;&#12290;<br>
<br>
&#22240;&#27492;&#65292;&#25105;&#20204;&#22312;&#25152;&#26377;&#30340;Hibernate DAO &#24635;&#26159;&#30475;&#21040;&#22914;&#19979;&#20195;&#30721;&#65306;<br>
</span><span class="921372908-18012007">
<pre>getHibernateTemplate().xxx</pre>
</span>&#22914;&#36825;&#26679;&#65292;&#33719;&#24471;&#20102;&#25968;&#25454;&#24211;&#36830;&#25509;&#21518;&#65292;&#20320;&#24819;&#24178;&#20160;&#20040;&#23601;&#24178;&#20160;&#20040;&#65292;&#20294;&#21097;&#19979;&#30340;&#20869;&#23481;&#27491;&#26159;&#19978;&#31995;&#21015;&#36951;&#28431;&#30340;&#65292;&#22312;<a href="#9">Hibernate
DAO &#23454;&#29616;</a>&#19968;&#33410;&#20013;&#20171;&#32461;<br>
<span style="font-family: monospace;"><br>
</span><br>
<h2><a name="6"></a>&#25318;&#25130;&#26426;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#25318;&#25130;&#26426; (Interceptor), &#26159; AOP (<span style="font-weight: bold;">A</span>spect-<span
 style="font-weight: bold;">O</span>riented <span
 style="font-weight: bold;">P</span>rogramming)
&#30340;&#21478;&#19968;&#31181;&#21483;&#27861;&#65292;&#25105;&#20204;&#30340;&#24212;&#29992;&#22312;&#20004;&#20010;&#22320;&#26041;&#20351;&#29992;&#20102;&#36825;&#31181;&#26426;&#21046;&#12290;AOP&#26412;&#36523;&#26159;&#19968;&#38376;&#35821;&#35328;&#65292;&#21482;&#19981;&#36807;&#25105;&#20204;&#20351;&#29992;&#30340;&#26159;&#22522;&#20110;JAVA&#30340;&#38598;&#25104;&#21040;Spring &#20013;&#30340;
SpringAOP&#12290;&#21516;&#26679;&#65292;&#25105;&#20204;&#23558;&#36890;&#36807;&#25105;&#20204;&#30340;&#20363;&#23376;&#26469;&#29702;&#35299;&#38476;&#29983;&#30340;&#27010;&#24565;&#12290;<br>
<br>
&#20808;&#30475;&#19968;&#19979;&#26368;&#24120;&#29992;&#30340;&#20107;&#21153;&#25511;&#21046;&#22120;&#25318;&#25130;&#26426;&#12290;&#22914;&#26524;&#19981;&#37319;&#29992;&#25318;&#25130;&#26426;&#30340;&#26426;&#21046;&#26102;&#65292;&#22312;&#20351;&#29992;JDBC&#36827;&#34892;&#25968;&#25454;&#24211;&#35775;&#38382;&#26102;&#65292;&#23384;&#22312;&#20004;&#31181;&#24773;&#20917;&#65306;<br>
<ul>
  <li><span style="font-weight: bold;">&#33258;&#21160;&#25552;&#20132;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#36825;&#26159;JDBC&#39537;&#21160;&#40664;&#35748;&#30340;&#27169;&#24335;&#65292;&#27599;&#27425;&#25968;&#25454;&#24211;&#25805;&#20316;(CRUD)&#25104;&#21151;&#23436;&#25104;&#21518;&#65292;&#37117;&#20316;&#20026;&#19968;&#20010;&#21333;&#29420;&#30340;&#20107;&#21153;&#33258;&#21160;&#25552;&#20132;&#65292;&#22914;&#26524;&#26410;&#25104;&#21151;&#23436;&#25104;&#65292;&#21363;&#25243;&#20986;&#20102;
SQLException &#30340;&#35805;&#65292;&#20165;&#26368;&#36817;&#30340;&#19968;&#20010;&#25805;&#20316;&#23558;&#22238;&#28378;&#12290;<br>
  </li>
  <li><span style="font-weight: bold;">&#38750;&#33258;&#21160;&#25552;&#20132;</span>&nbsp;&nbsp;&nbsp;
&#36825;&#26159;&#24819;&#26356;&#22909;&#30340;&#25511;&#21046;&#20107;&#21153;&#26102;&#38656;&#35201;&#31243;&#24207;&#22320;&#26041;&#24335;&#36827;&#34892;&#25511;&#21046;&#65306;</li>
  <ul>
    <li>&#22312;&#36827;&#34892;&#35813;&#20107;&#21153;&#21333;&#20803;&#30340;&#20219;&#20309;&#25805;&#20316;&#20043;&#21069; <span style="font-family: monospace;">setAutoCommit(false)</span></li>
    <li>&#22312;&#25104;&#21151;&#23436;&#25104;&#20107;&#21153;&#21333;&#20803;&#21518; <span style="font-family: monospace;">commit()</span></li>
    <li>&#22312;&#24322;&#24120;&#21457;&#29983;&#21518;<span style="font-family: monospace;"> rollback()<br>
      </span></li>
  </ul>
</ul>
<br>
&#33258;&#21160;&#25552;&#20132;&#27169;&#24335;&#26159;&#19981;&#34987;&#25512;&#33616;&#30340;&#65292;&#22240;&#20026;&#27599;&#20010;&#25805;&#20316;&#37117;&#23558;&#20135;&#29983;&#19968;&#20010;&#20107;&#21153;&#28857;&#65292;&#36825;&#23545;&#20110;&#22823;&#30340;&#24212;&#29992;&#26469;&#35828;&#24615;&#33021;&#23558;&#21463;&#21040;&#24433;&#21709;&#65307;&#20877;&#26377;&#65292;&#23545;&#20110;&#24120;&#35265;&#30340;&#19994;&#21153;&#36923;&#36753;&#65292;&#36825;&#31181;&#27169;&#24335;&#26174;&#24471;&#26080;&#33021;&#20026;&#21147;&#12290;&#27604;
&#22914;&#65306;<br>
&#36716;&#24080;&#65292;&#20174;A&#24080;&#25143;&#21462;&#20986;100&#20803;&#65292;&#23558;&#20854;&#23384;&#20837;B&#24080;&#25143;&#65307;&#22914;&#26524;&#22312;&#36825;&#20004;&#20010;&#25805;&#20316;&#20043;&#38388;&#21457;&#29983;&#20102;&#38169;&#35823;&#65292;&#37027;&#20040;&#29992;&#25143;A&#23558;&#25439;&#22833;&#20102;100&#20803;&#65292;&#32780;&#26412;&#26469;&#24212;&#35813;&#32473;&#24080;&#25143;B&#30340;&#65292;&#21364;&#22240;&#20026;&#22833;&#36133;&#32473;&#20102;&#38134;
&#34892;&#12290;<br>
&#25152;&#20197;&#65292;&#24314;&#35758;&#22312;&#25152;&#26377;&#30340;&#24212;&#29992;&#20013;&#65292;&#22914;&#26524;&#20351;&#29992; JDBC &#37117;&#23558;&#19981;&#24471;&#19981;&#37319;&#29992;&#38750;&#33258;&#21160;&#25552;&#20132;&#27169;&#24335;(&#20320;&#20204;&#35201;&#33021;&#21457;&#29616;&#20102;&#22312;&#25105;&#20204;&#30340; JDBC
&#37027;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#37319;&#29992;&#30340;&#23601;&#26159;&#33258;&#21160;&#25552;&#20132;&#27169;&#24335;&#65292;&#25105;&#20204;&#26159;&#20026;&#20102;&#25226;&#31934;&#21147;&#25918;&#22312;JDBC&#19978;&#65292;&#32780;&#19981;&#26159;&#20107;&#21153;&#22788;&#29702;&#19978;)&#65292;&#21363;&#25105;&#20204;&#19981;&#24471;&#19981;&#22312;&#27599;&#20010;&#26041;&#27861;&#20013;&#65306;<br>
<br>
<span class="921372908-18012007">
<pre><span style="color: rgb(51, 51, 255);">try</span> {<br>	    // <span
 style="color: rgb(255, 0, 0);">&#22312;&#33719;&#24471;&#36830;&#25509;&#21518;&#65292;&#31435;&#21363;&#36890;&#36807;&#35843;&#29992;&#12288;setAutoCommit(false) &#23558;&#20107;&#21153;&#22788;&#29702;&#32622;&#20026;&#38750;&#33258;&#21160;&#25552;&#20132;&#27169;&#24335;</span><br><br>            // Prepare Query to fetch the user Information<br>            pst = conn.prepareStatement(findByName);<br>            <br>            // ...<br><br>            <span
 style="color: rgb(255, 0, 0);">conn.commit();</span><br><br>        }  <span
 style="color: rgb(51, 51, 255);">catch</span>(Exception ex) {<br>            <span
 style="color: rgb(255, 0, 0);">conn.rollback();</span><br><br>            throw ex;<br>        } <span
 style="color: rgb(51, 51, 255);">finally</span> {<br>            try {<br>                // Close Result Set and Statement<br>                if (rset != null) rset.close();<br>                if (pst != null) pst.close();<br>                <br>            } catch (Exception ex) {<br>                ex.printStackTrace();<br>                throw new Exception("SQL Error while closing objects = " +<br>                        ex.toString());<br>            }<br>  <span
 class="921372908-18012007"><pre>      }</pre></span></pre>
</span><br>
&#36825;&#26679;&#20195;&#30721;&#22312;AOP&#30340;&#20513;&#23548;&#32773;&#30475;&#26469;&#26159;&#8220;&#32942;&#33039;&#8221;&#30340;&#20195;&#30721;&#12290;&#20182;&#20204;&#35748;&#20026;&#65292;&#25152;&#26377;&#30340;&#19982;&#20107;&#21153;&#26377;&#20851;&#30340;&#26041;&#27861;&#37117;&#24212;&#24403;&#21487;&#20197;&#38598;&#20013;&#37197;&#32622;&#65288;&#35265;<a href="#7">&#22768;&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;</a>&#65289;&#65292;
&#24182;&#33258;&#21160;&#25318;&#25130;&#65292;&#31243;&#24207;&#24212;&#24403;&#20851;&#24515;&#20182;&#20204;&#30340;&#20027;&#35201;&#20219;&#21153;&#65292;&#21363;&#21830;&#19994;&#36923;&#36753;&#65292;&#32780;&#19981;&#24212;&#21644;&#20107;&#21153;&#22788;&#29702;&#30340;&#20195;&#30721;&#25605;&#21644;&#22312;&#19968;&#36215;&#12290;<br>
<br>
&#25105;&#20808;&#30475;&#30475; Spring &#26159;&#24590;&#20040;&#20570;&#21040;&#25318;&#25130;&#30340;&#65306;<br>
<br>
<h3><a name="6.1"></a>Spring &#20869;&#32622;&#25903;&#25345;&#30340;&#20107;&#21153;&#22788;&#29702;&#25318;&#25130;&#26426;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#36825;&#20010;&#37197;&#32622;&#27604;&#24819;&#35937;&#30340;&#35201;&#31616;&#21333;&#30340;&#22810;&#65306;<br>
<span class="921372908-18012007">
<pre>&lt;aop:config&gt;<br>        &lt;!--<br>        This definition creates auto-proxy infrastructure based on the given pointcut,<br>        expressed in AspectJ pointcut language. Here: applying the advice named<br>        "txAdvice" to all methods on classes named PetStoreImpl.<br>        <span
 style="color: rgb(255, 0, 0);">&#25351;&#20986;&#22312; PetStoreFacade &#30340;&#25152;&#26377;&#26041;&#27861;&#37117;&#23558;&#37319;&#29992; txAdvice(&#22312;&#32039;&#25509;&#30528;&#30340;&#20803;&#32032;&#20013;&#23450;&#20041;&#20102;&#65289;&#20107;&#21153;&#26041;&#38024;&#65292;&#27880;&#24847;&#65292;&#25105;&#20204;&#36825;&#37324;&#34429;&#28982;&#25351;&#23450;&#30340;&#26159;&#25509;&#21475; PetStoreFacace, </span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">        &#20294;&#20854;&#26263;&#31034;&#30528;&#20854;&#25152;&#26377;&#30340;&#23454;&#29616;&#31867;&#20063;&#23558;&#21516;&#26679;&#20855;&#26377;&#36825;&#31181;&#24615;&#36136;&#65292;&#22240;&#20026;&#26412;&#36523;&#23601;&#26159;&#23454;&#29616;&#31867;&#30340;&#26041;&#27861;&#22312;&#25191;&#34892;&#30340;&#65292;&#25509;&#21475;&#26159;&#27809;&#26377;&#26041;&#27861;&#20307;&#30340;&#12290;</span><br>    --&gt;<br>        <span
 style="color: rgb(255, 0, 0);">&lt;aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/&gt;</span><br>        <br><br>        &lt;!-- &#20854;&#23427;&#25318;&#25130;&#26426;--&gt;<br><br>    &lt;/aop:config&gt;</pre>
</span>1. &#25152;&#26377;&#30340;&#25318;&#25130;&#26426;&#37197;&#32622;&#37117;&#25918;&#22312; &lt;aop:config&gt; &#37197;&#32622;&#20803;&#32032;&#20013;.<br>
2. &#19979;&#38754;&#36824;&#26159;&#38656;&#35201;&#29702;&#35299;&#19968;&#19979;&#20960;&#20010;&#26377;&#20851;AOP&#30340;&#19987;&#29992;&#21517;&#35789;&#65292;&#19981;&#36807;&#65292;&#26159;&#25402;&#25277;&#35937;&#30340;&#65292;&#26368;&#22909;&#33021;&#20250;&#24847;&#20986;&#20854;&#30340;&#29992;&#24847;<br>
<ul>
  <li>pointcut&nbsp; &#20999;&#20837;&#28857;&#65292;&#27604;&#22914;&#65306;updateAccount
&#26041;&#27861;&#38656;&#35201;&#36827;&#34892;&#20107;&#21153;&#31649;&#29702;&#65292;&#21017;&#36825;&#20010;&#20999;&#20837;&#28857;&#23601;&#26159;&#8220;&#25191;&#34892;&#26041;&#27861;&#20307;&#8221;(execution)&#12290;Spring &#25152;&#26377;&#25903;&#25345;&#30340;&#20999;&#20837;&#28857;&#31867;&#22411;&#22312;&#37117;&#22312; Spring
reference: 6.2.3.1. Supported Pointcut Designators &#20013;&#21015;&#20986;&#20102;&#12290;<br>
  </li>
  <li>advice&nbsp;&nbsp;&nbsp; &#35201;&#23545;&#36825;&#20010;&#20999;&#20837;&#28857;&#36827;&#34892;&#20160;&#20040;&#25805;&#20316;&#65292;&#27604;&#22914;&#20107;&#21153;&#25511;&#21046;</li>
  <li>advisor&nbsp;&nbsp; Spring &#29305;&#26377;&#30340;&#27010;&#24565;&#65292;&#23558;&#19978;&#20004;&#20010;&#27010;&#24565;&#21512;&#21040;&#19968;&#20010;&#27010;&#24565;&#20013;&#26469;&#65292;&#21363;&#19968;&#20010; advisor
&#21253;&#21547;&#20102;&#19968;&#20010;&#20999;&#20837;&#28857;&#21450;&#23545;&#36825;&#20010;&#20999;&#20837;&#28857;&#25152;&#23454;&#26045;&#30340;&#25805;&#20316;&#12290;</li>
</ul>
&nbsp;&#22240;&#20026; &#26041;&#27861;&#25191;&#34892;&#20999;&#20837;&#28857; execution &#20026;&#26368;&#24120;&#35265;&#30340;&#20999;&#20837;&#28857;&#31867;&#22411;&#65292;&#25105;&#20204;&#30528;&#37325;&#20171;&#32461;&#19968;&#19979;&#65292;execution &#30340;&#23436;&#20840;&#24418;&#24335;&#20026;&#65306;<br>
<pre class="programlisting"><span style="font-weight: bold;">execution</span>(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)</pre>
&#36825;&#26159;&#19968;&#20010;&#27491;&#21017;&#34920;&#36798;&#24335;&#65292;&#20854;&#20013;&#30001; '?' &#32467;&#23614;&#30340;&#37096;&#20998;&#26159;&#21487;&#36873;&#30340;&#12290;&#32763;&#35793;&#36807;&#26469;&#23601;&#26159;&#65306;<br>
<pre class="programlisting"><span style="font-weight: bold;"><span
 style="font-family: monospace;">&#25191;&#34892;</span></span>(&#26041;&#27861;&#35775;&#38382;&#20462;&#39280;&#31526;? &#26041;&#27861;&#36820;&#22238;&#31867;&#22411; &#22768;&#26126;&#31867;&#22411;? &#26041;&#27861;&#21517;(&#26041;&#27861;&#21442;&#25968;&#31867;&#22411;) &#25243;&#20986;&#24322;&#24120;?)<br></pre>
&#25152;&#26377;&#30340;&#36825;&#20123;&#37117;&#26159;&#29992;&#26469;&#23450;&#20041;&#25191;&#34892;&#20999;&#20837;&#28857;&#65292;&#21363;&#37027;&#20123;&#26041;&#27861;&#24212;&#35813;&#34987;&#20399;&#36873;&#20026;&#20999;&#20837;&#28857;&#65306;<br>
<ul>
  <li>&#26041;&#27861;&#35775;&#38382;&#20462;&#39280;&#31526;&nbsp;&nbsp; &#21363; public, private &#31561;&#31561;<br>
  </li>
  <li>&#26041;&#27861;&#36820;&#22238;&#31867;&#22411;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#21363;&#26041;&#27861;&#36820;&#22238;&#30340;&#31867;&#22411;&#65292;&#22914; void,
String &#31561;&#31561;<br>
  </li>
  <li>&#22768;&#26126;&#31867;&#22411;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; 1.5&#30340;&#35821;&#27861;&#65292;&#29616;&#22312;&#21487;&#20197;&#20808;&#24573;&#30053;&#23427;<br>
  </li>
  <li>&#26041;&#27861;&#21517;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#26041;&#27861;&#30340;&#21517;&#23383;<br>
  </li>
  <li>&#26041;&#27861;&#21442;&#25968;&#31867;&#22411;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#26041;&#27861;&#30340;&#21442;&#25968;&#31867;&#22411;<br>
  </li>
  <li>&#25243;&#20986;&#24322;&#24120;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; &#26041;&#27861;&#22768;&#26126;&#30340;&#25243;&#20986;&#30340;&#24322;&#24120;<br>
  </li>
</ul>
<br>
<br>
&#20363;&#22914;&#65292;&#25152;&#26377;dao&#20195;&#30721;&#34987;&#23450;&#20041;&#22312;&#21253; com.xyz.dao&#12288;&#21450;&#23376;&#21253; com.xyz.dao.hibernate, &#25110;&#32773;&#20854;&#23427;&#65292;&#22914;&#26524;&#36824;&#26377;&#30340;&#35805;&#65292;&#23376;&#21253;&#20013;,
&#37324;&#38754;&#23450;&#20041;&#30340;&#26159;&#25552;&#20379;DAO&#21151;&#33021;&#30340;&#25509;&#21475;&#25110;&#31867;&#65292;&#37027;&#20040;&#34920;&#36798;&#24335;&#65306;<br>
<pre class="programlisting"><span style="font-weight: bold;">execution(* com.xyz.dao..*.*(..))</span></pre>
&#34920;&#31034;&#20999;&#20837;&#28857;&#20026;&#65306;&#25191;&#34892;&#23450;&#20041;&#22312;&#21253; com.xyz.dao &#21450;&#20854;&#23376;&#21253;&#65288;&#22240;&#20026; <span style="font-family: monospace;">..
</span>&#25152;&#33268;) &#20013;&#30340;&#20219;&#20309;&#26041;&#27861;<br>
<br>
&#35814;&#32454;&#24773;&#20917;&#21487;&#20197;&#21442;&#35265; Spring refernce: <span style="font-weight: bold;">6.2.3.4.
Examples</span><br>
<br>
<br>
<span class="921372908-18012007">
<pre><span style="color: rgb(255, 0, 0);">&lt;aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/&gt;<br></span></pre>
</span>&#22240;&#27492;&#36825;&#20010;&#34920;&#36798;&#24335;&#20026;&#25191;&#34892;&#23450;&#20041;&#22312;&#31867; PetStoreFacade&#12288;&#21450;&#20854;&#23454;&#29616;&#31867;&#20013;&#30340;&#25152;&#26377;&#26041;&#27861;&#65292;&#37319;&#21462;&#30340;&#21160;&#20316;&#23450;&#20041;&#22312; txAdvice &#20013;.
&#20851;&#20110;&#35813; advice &#30340;&#23450;&#20041;&#65292;&#65288;&#35265;<a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#7">&#22768;
&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;</a>&#65289;&#19968;&#33410;<br>
<br>
<br>
<h3><a name="6.2"></a>Spring &#33258;&#23450;&#25318;&#25130;&#26426;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#30475;&#26469;&#20026;&#20102;&#36827;&#34892;&#20107;&#21153;&#25511;&#21046;&#65292;&#25105;&#20204;&#21482;&#38656;&#31616;&#21333;&#22320;&#37197;&#32622;&#20960;&#19979;&#65292;&#25152;&#26377;&#30340;&#24037;&#20316;&#37117;&#30001; Spring
&#26469;&#20570;&#12290;&#36825;&#26679;&#22266;&#28982;&#24456;&#22909;&#65292;&#20294;&#26377;&#26102;&#25105;&#20204;&#38656;&#35201;&#26377;&#25105;&#20204;&#29305;&#26377;&#30340;&#25511;&#21046;&#36923;&#36753;&#12290;&#22240;&#20026;Spring
&#19981;&#21487;&#33021;&#21253;&#21547;&#25152;&#26377;&#20154;&#38656;&#35201;&#30340;&#25152;&#26377;&#25318;&#25130;&#26426;&#12290;&#25152;&#20197;&#23427;&#25552;&#20379;&#20102;&#36890;&#36807;&#31243;&#24207;&#30340;&#26041;&#24335;&#21152;&#20197;&#23450;&#21046;&#30340;&#26041;&#24335;&#12290;&#25105;&#20204;&#30340;&#39033;&#30446;&#20013;&#23601;&#26377;&#36825;&#20040;&#19968;&#20010;&#25318;&#25130;&#26426;&#65292;&#22312;&#29992;&#25143;&#30830;&#35748;&#20184;&#27454;&#21518;&#65292;&#23558;&#23450;&#21333;&#20449;&#24687;&#36890;&#36807;
email &#30340;&#26041;&#24335;&#21457;&#36865;&#32473;&#27880;&#20876;&#29992;&#25143;&#30340;&#37038;&#31665;&#20013;&#12290;<br>
<br>
<pre class="programlisting"><span style="font-weight: bold;"><span
 style="font-family: monospace;">&lt;aop:config&gt;<br>  ...<br><br>        &lt;!-- </span></span><span
 style="font-family: monospace;"><span style="color: rgb(255, 0, 0);">&#24403;&#25191;&#34892; PetStoreFacade.insertOrder&#26041;&#27861;&#65292;&#35813;&#26041;&#27861;&#26368;&#21518;&#19968;&#20010;&#21442;&#25968;&#20026;Order&#31867;&#22411;&#26102;&#65288;&#20854;&#23454;&#25105;&#20204;&#30340;&#20363;&#23376;&#20013;&#21482;&#26377;&#19968;&#20010; insertOrder &#26041;&#27861;&#65292;&#20294;&#36825;&#21578;&#35785;&#20102;&#25105;&#20204;&#65292;&#24403;&#25105;&#20204;&#30340;&#25509;&#21475;&#25110;&#31867;&#20013;&#26377;&#37325;&#36733;&#20102;&#30340;&#26041;&#27861;&#65292;</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#24182;&#19988;&#21508;&#20010;&#37325;&#36733;&#30340;&#26041;&#27861;&#21487;&#33021;&#20351;&#29992;&#19981;&#21516;&#30340;&#25318;&#25130;&#26426;&#26426;&#21046;&#26102;&#65292;&#25105;&#20204;&#21487;&#20197;&#36890;&#36807;&#26041;&#27861;&#30340;&#21442;&#25968;&#21152;&#20197;&#25351;&#23450;&#65289;&#65292;&#23558;&#25191;&#34892;emailAdvice(&#22312;&#26368;&#21518;&#23450;&#20041;&#30340;&#37027;&#20010;&#20803;&#32032;&#65289;</span></span><span
 style="font-weight: bold;"><span style="font-family: monospace;">--&gt;<br>        &lt;aop:advisor pointcut="execution(* *..PetStoreFacade.insertOrder(*..Order))" advice-ref="emailAdvice"/&gt;<br>        <br>    &lt;/aop:config&gt;</span></span></pre>
&#32418;&#33394;&#30340;&#27880;&#37322;&#24050;&#32463;&#35828;&#30340;&#24456;&#28165;&#26970;&#36825;&#20010; Advisor &#20102;&#65292;&#23427;&#30340;&#20999;&#20837;&#28857;(pointcut) &#20026; PetStoreFacade &#30340; void
insertOrder(Order order) &#26041;&#27861;&#65292;&#37319;&#21462;&#30340;&#21160;&#20316;&#20026;&#24341;&#29992;&#30340; emailAdvice, &#19979;&#38754;&#25105;&#20204;&#23601;&#26469;&#30475;&#30475; emailAdvice:<br>
<br>
<pre class="programlisting"><span style="font-weight: bold;"><span
 style="font-family: monospace;">    &lt;bean id="emailAdvice" class="org.springframework.samples.jpetstore.domain.logic.SendOrderConfirmationEmailAdvice"&gt;<br>        &lt;property name="mailSender" ref="mailSender"/&gt;<br>    &lt;/bean&gt;</span></span></pre>
&#23427;&#32473;&#20102;&#36825;&#20010; advice &#30340;&#23454;&#29616;&#31867;&#20026; logic &#21253;&#20013; SendOrderConfirmationEmailAdvice, &#35813;Bean
&#24341;&#29992;&#20102;&#25105;&#20204;&#21069;&#38754;&#23450;&#20041;&#30340;&#37038;&#20214;&#21457;&#36865;&#22120;&#65288;&#19968;&#20010; Spring &#20869;&#32622;&#30340;&#37038;&#20214;&#21457;&#36865;&#22120;&#65289;.<br>
<br>
&#19979;&#38754;&#30475;&#30475;&#36825;&#20010;&#23454;&#29616;&#31867;&#65306;<br>
<pre class="programlisting"><span style="font-weight: bold;"><span
 style="font-family: monospace;">public class SendOrderConfirmationEmailAdvice implements <span
 style="color: rgb(51, 204, 0);">AfterReturningAdvice</span>, <span
 style="color: rgb(255, 0, 0);"><span style="color: rgb(51, 51, 255);">InitializingBean</span> </span>{<br>    // user jes on localhost<br>    private static final String DEFAULT_MAIL_FROM = "test@pprun.org";<br>    <br>    private static final String DEFAULT_SUBJECT = "Thank you for your order!";<br>    <br>    private final Log logger = LogFactory.getLog(getClass());<br>    <br>    <span
 style="color: rgb(255, 0, 0);">private MailSender mailSender;</span><br>    <br>    private String mailFrom = DEFAULT_MAIL_FROM;<br>    <br>    private String subject = DEFAULT_SUBJECT;<br>    <br>   <span
 style="color: rgb(255, 0, 0);"> public void setMailSender(MailSender mailSender) {</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">        this.mailSender = mailSender;</span><br
 style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">    }</span><br>    <br>    public void setMailFrom(String mailFrom) {<br>        this.mailFrom = mailFrom;<br>    }<br>    <br>    public void setSubject(String subject) {<br>        this.subject = subject;<br>    }<br>    <br>    public void throws Exception {<br>        if (this.mailSender == null) {<br>            throw new IllegalStateException("mailSender is required");<br>        }<br>    }<br>    <br>    <span
 style="color: rgb(204, 153, 51);">/**</span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * </span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * @param returnValue &#34987;&#25318;&#25130;&#30340;&#26041;&#27861;&#30340;&#36820;&#22238;&#20540;</span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * @param m &#34987;&#25318;&#25130;&#30340;&#26041;&#27861;&#30340;&#25152;&#26377;&#20449;&#24687;&#65288;Method&#31867;&#23553;&#35013;&#20102;&#36825;&#20123;&#20449;&#24687;&#65289;</span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * @param args &#34987;&#25318;&#25130;&#30340;&#26041;&#27861;&#30340;&#25152;&#26377;&#21442;&#25968;&#32452;&#25104;&#30340;&#25968;&#32452;</span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * @param target &#30446;&#26631;&#23545;&#35937;&#65292;&#23545;&#20110;&#26041;&#27861;&#25191;&#34892;&#26469;&#35828;&#65292;&#21363;&#26159;&#26041;&#27861;&#25152;&#22312;&#30340;&#31867;&#30340;&#23454;&#20363;&#65288;&#19982; this &#21516;&#65292;&#25209;&#24403;&#21069;&#23545;&#35937;&#65289;</span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     * @throws java.lang.Throwable </span><br
 style="color: rgb(204, 153, 51);"><span
 style="color: rgb(204, 153, 51);">     */</span><br>    public void <span
 style="color: rgb(0, 102, 0);"><span style="color: rgb(51, 204, 0);">afterReturning</span>(</span>Object returnValue, Method m, Object[] args, Object target) throws Throwable {<br>        <span
 style="color: rgb(204, 153, 51);">// &#25105;&#20204;&#34987;&#25318;&#25130;&#30340;&#26041;&#27861;&#20026; void insertOrder(Order order)&#65292;&#26041;&#27861;&#21482;&#26377;&#19968;&#20010;&#21442;&#25968;&#65292;&#25152;&#20197;&#21487;&#30693;&#25968;&#25454;&#30340;&#31532;1&#20010;&#20803;&#32032;&#21363;&#26159;&#34987;&#20256;&#36827;&#30340;&#12288;order &#23545;&#35937;<br>        // &#24471;&#21040;&#20102;order &#23545;&#35937;&#65292;&#23601;&#21487;&#20197;&#23558; order &#23545;&#24212;&#30340;&#24080;&#25143;&#21517;&#21450;&#24080;&#21333;&#21495;&#21457;&#36865;&#21040;&#37038;&#20214;&#20013;&#65292;&#20197;&#20415;&#30830;&#35748;&#26080;&#35823;&#12290;<br></span>        Order order = (Order) args[0];<br>        Account account = ((PetStoreFacade) target).getAccount(<span
 style="color: rgb(204, 153, 51);">order</span>.getUser().getUsername());<br>        <br>        // don't do anything if email address is not set<br>        if (account.getEmail() == null || account.getEmail().length() == 0) {<br>            return;<br>        }<br>        <br>        StringBuffer text = new StringBuffer();<br>        text.append("Dear ").append(account.getFirstname()).<br>                append(' ').append(account.getLastname());<br>        text.append(", thank your for your order from JPetStore. " +<br>                "Please note that your order number is ");<br>        text.append(<span
 style="color: rgb(204, 153, 51);">order</span>.getId());<br>        <br>        SimpleMailMessage mailMessage = new SimpleMailMessage();<br>        mailMessage.setTo(account.getEmail());<br>        mailMessage.setFrom(this.mailFrom);<br>        mailMessage.setSubject(this.subject);<br>        mailMessage.setText(text.toString());<br>        try {<br>            this.<span
 style="color: rgb(255, 0, 0);">mailSender</span>.send(mailMessage);<br>        } catch (MailException ex) {<br>            // just log it and go on<br>            logger.warn("An exception occured when trying to send email", ex);<br>        }<br>    }<br>    <br>}</span></span></pre>
<br>
1. <span style="color: rgb(255, 0, 0);">&#32418;</span>&#33394;&#30340;&#20869;&#23481;&#21363;&#20026;&#21453;&#21521;&#27880;&#20837;&#30340; <span
 style="color: rgb(255, 0, 0);">mailSender </span>&#23646;&#24615;<br>
<br>
2. <span style="color: rgb(51, 51, 255);">&#34013;</span>&#33394;&#30340;&#20869;&#23481;&#20026; Spring Bean
&#30340;&#19968;&#20010;&#36890;&#29992;&#30340;&#25509;&#21475; <span style="color: rgb(51, 102, 255);">InitializingBean </span>&#65292;
&#23454;&#29616;&#31867;&#38656;&#35201;&#23454;&#29616;&#35813;&#25509;&#21475;&#23450;&#20041;&#30340;&#26041;&#27861; <span style="color: rgb(51, 102, 255);">afterPropertiesSet()</span>&nbsp;
&#65292;&#35813;&#26041;&#27861;&#20013;&#19968;&#33324;&#26159;&#22312;Bean &#34987;&#21021;&#22987;&#21270;&#21518;&#24182;&#35774;&#32622;&#20102;&#25152;&#26377;&#30340; setter
&#27880;&#20837;&#21518;&#35843;&#29992;&#30340;&#12290;&#25152;&#20197;&#36825;&#37324;&#26159;&#20445;&#35777;&#37038;&#20214;&#21457;&#36865;&#22120;&#37197;&#32622;&#27491;&#30830;&#12290;&#22240;&#20026;&#22914;&#26524;&#27809;&#26377;&#37197;&#32622;&#27491;&#30830;&#65292;&#19979;&#38754;&#30340;&#24037;&#20316;&#26159;&#26080;&#27861;&#36827;&#34892;&#30340;&#65292;&#25152;&#20197;&#19982;&#20854;&#31561;&#37027;&#26102;&#25243;&#20986;&#24322;&#24120;&#65292;&#36824;&#19981;&#22914;&#26089;&#26089;&#22320;&#22312;&#37096;&#32626;&#26102;&#23601;&#21578;&#30693;
&#65288;&#36890;&#36807;&#25243;&#20986; IllegalStateException &#26469;&#25552;&#31034;&#65289;<br>
<br>
3. <span style="color: rgb(51, 204, 0);">&#32511;</span>&#33394;&#30340;&#20869;&#23481;&#20026;&#36825;&#20010; Advise
&#30340;&#26680;&#24515;&#65292;&#21363;&#22312;&#20999;&#20837;&#28857;&#34987;&#20999;&#20837;&#21518;&#23558;&#37319;&#29992;&#30340;&#21160;&#20316;&#12290;&#22240;&#20026; Advise &#20063;&#21516;&#26679;&#26377;&#22810;&#31181;&#31867;&#22411;&#65292;&#27604;&#22914;&#25105;&#20204;&#36825;&#37324;&#30340;&#8220;<span
 style="font-weight: bold;">&#26041;&#27861;&#27491;&#24120;&#36820;&#22238;</span>&#8221;&#65292;&#8220;<span
 style="font-weight: bold;">&#26041;&#27861;&#25191;&#34892;&#21069;</span>&#8221;&#65292;&#8220;<span
 style="font-weight: bold;">&#26041;&#27861;&#25191;&#34892;&#21518;</span>&#8221;&#65292;&#8220;<span
 style="font-weight: bold;">&#29615;&#32469;&#22312;&#26041;&#27861;&#25191;&#34892;&#21069;&#21518;</span>&#8221;&#65292;&#8220;<span
 style="font-weight: bold;">&#26041;&#27861;&#25243;&#20986;&#24322;&#24120;&#26102;</span>&#8221;&#31561;&#31561;(&#35814;&#24773;&#21442;&#35265; Spring Reference:<span
 style="font-weight: bold;"> 6.2.4. Declaring advice</span>)&#12290;&#20294;&#26159;&#25105;&#20204;&#30340;&#36923;&#36753;&#20026;&#22312;&#29992;&#25143;
&#30830;&#35748;&#23450;&#21333;&#24182;&#19988;&#25191;&#34892;&#25104;&#21151;&#65288;&#25152;&#35859;&#30340;&#25104;&#21151;&#26159;&#25351;&#23558;&#36825;&#19968;&#23450;&#21333;&#25554;&#20837;&#21040;&#20102;&#34920; Order &#20013;&#20102;&#65289;&#21518;&#65292;&#23558;&#21457;&#36865;&#19968;&#30830;&#35748;&#20449;&#12290;&#25152;&#20197;&#8221;&#26041;&#27861;&#27491;&#24120;&#36820;&#22238;&#8220;&#23436;&#20840;&#31526;&#21512;&#25105;&#20204;&#30340;&#35201;&#27714;&#12290;<br>
<span style="color: rgb(51, 204, 0);"><span style="color: rgb(0, 0, 0);">&#25509;
&#21475;</span>AfterReturningAdvice <span style="color: rgb(0, 0, 0);">&#21363;&#26159;
Spring&#20013;&#34920;&#31034;</span></span><span style="color: rgb(0, 0, 0);">&#8221;&#26041;&#27861;&#27491;&#24120;&#36820;&#22238;&#8220;
&#36825;&#19968;&#35821;&#20041;&#30340; Advice, &#25152;&#20197;&#25105;&#20204;&#23454;&#29616;&#36825;&#20010;&#25509;&#21475;&#21450;&#20854;&#24517;&#39035;&#30340;&#26041;&#27861; <span style="color: rgb(51, 204, 0);">afterReturning.<br>
</span></span>&#26041;&#27861;&#20195;&#30721;&#30340;&#24037;&#20316;&#20854;&#23454;&#24182;&#19981;&#37325;&#35201;&#65292;&#21482;&#35201;&#25105;&#20204;&#29702;&#35299;&#36825;&#20123;&#8220;&#39764;&#27861;&#8221;&#19968;&#26679;&#30340;&#25216;&#26415;&#21518;&#65292;&#23454;&#29616;&#20195;&#30721;&#26159;&#24456;&#31616;&#21333;&#30340;&#12290;&#20540;&#24471;&#25552;&#21450;&#30340;&#26159;&#36825;&#20010;&#26041;&#27861;&#30340;&#21442;&#25968;&#65292;&#36825;
&#20123;&#21442;&#25968;&#26159;&#23553;&#35013;&#20102;&#20999;&#20837;&#28857;&#30340;&#25152;&#26377;&#20449;&#24687;&#65292;&#35831;&#35265;&#19978;&#38754;&#30340;<span style="color: rgb(204, 153, 51);">&#27880;&#37322;</span>&#12290;&#22312;
&#25105;&#20204;&#30340;&#23454;&#29616;&#20013;&#21482;&#20351;&#29992;&#20102;&#34987;&#25318;&#25130;&#26041;&#27861;&#30340;&#21442;&#25968;&#65292;&#22312;&#22797;&#26434;&#30340; Advice &#23454;&#29616;&#20013;&#21487;&#33021;&#20250;&#29992;&#21040;&#20999;&#20837;&#28857;&#25152;&#26377;&#20449;&#24687;&#12290;<br>
<br>
<br>
<br>
<h2><a name="7"></a>&#22768;&#26126;&#24615;&#20107;&#21153;&#25511;&#21046;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#30001;&#20110;&#20320;&#20204;&#37117;&#19981;&#29087;&#24713;EJB&#65292;&#20854;&#23454;EJB&#26377;&#19968;&#20010;&#19987;&#29992;&#21517;&#35789;&#21483;&#20570; CMT (<span style="font-weight: bold;">C</span>ontainer
<span style="font-weight: bold;">M</span>anagement <span
 style="font-weight: bold;">T</span>ransaction)&#65292;&#23427;&#20063;&#26159;&#22312;EJB&#30340;&#37096;&#32626;&#25991;&#20214;&#20013;&#23545;&#27599;&#20010;&#26041;&#27861;&#22768;&#26126;&#25191;&#34892;&#36825;&#20010;
&#26041;&#27861;&#26159;&#21542;&#38656;&#35201;&#36827;&#34892;&#20107;&#21153;&#25511;&#21046;&#65292;&#20197;&#21450;&#22914;&#20309;&#25511;&#21046;&#12290;<br>
<br>
&#29702;&#35299;&#20107;&#21153;&#22788;&#29702;&#30340;&#27010;&#24565;&#26159;&#25484;&#25569;&#20219;&#20309;&#20107;&#21153;&#22788;&#29702;&#26694;&#26550;&#30340;&#30340;&#20851;&#38190;&#65292;&#25152;&#20197;&#25105;&#20204;&#24517;&#39035;&#24378;&#36843;&#33258;&#24049;&#23613;&#37327;&#29702;&#35299;&#12290;Spring &#30340;&#20107;&#21153;&#22788;&#29702;&#26694;&#26550;&#20063;&#19981;&#20363;&#22806;&#65292;&#35814;&#32454;&#24773;&#20917;&#21487;&#20197;&#21442;&#35265;
(Spring In Action: 5.3.1
Understanding transaction attributes)&#65306;<br>
<ul>
  <li>Propagation behavior&nbsp; &#20256;&#25773;&#34892;&#20026;<br>
  </li>
  <li>Isolation level &#38548;&#31163;&#32423;&#21035;<br>
  </li>
  <li>Read-only hints &#21482;&#35835;&#25552;&#31034;<br>
  </li>
  <li>The transaction timeout period &#20107;&#21153;&#36229;&#26102;&#21608;&#26399;<br>
  </li>
</ul>
<br>
<h3><a name="7.1"></a>&#20107;&#21153;&#38548;&#31163;&#32423;&#21035;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
<br>
&#30001;&#20110;&#20107;&#21153;&#38548;&#31163;&#32423;&#21035;&#30340;&#27010;&#24565;&#30456;&#23545;&#31616;&#21333;&#20123;&#65292;&#25152;&#20197;&#25105;&#20204;&#39318;&#20808;&#30475;&#30475;&#20107;&#21153;&#38548;&#31163;&#32423;&#21035;<br>
<br>
&#25171;&#24320; java.sql.Connection&#31867;&#30340; doc
(jdk-1_5_0-doc/docs/api/java/sql/Connection.html)&#65292;&#25105;&#20204;&#21487;&#20197;&#30475;&#21040;&#20854;&#22768;&#26126;&#20102;&#20116;&#20010;&#20107;&#21153;&#38548;&#31163;&#26497;&#21035;&#24120;&#37327;&#25104;
&#21592;&#65306;<br>
<ol>
  <li><span style="font-weight: bold;">TRANSACTION_NONE&nbsp;</span>&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; A constant indicating that transactions are not
supported. <br>
  </li>
  <li><span style="font-weight: bold;">TRANSACTION_READ_UNCOMMITTED</span>&nbsp;&nbsp;&nbsp;
A constant indicating that dirty reads, non-repeatable reads and
phantom reads can occur. This level allows a row changed by one
transaction to be read by another transaction before any changes in
that row have been committed (a "dirty read"). If any of the changes
are rolled back, the second transaction will have retrieved an invalid
row.()</li>
  <li><span style="font-weight: bold;">TRANSACTION_READ_COMMITTED</span>&nbsp;&nbsp;&nbsp;
A constant indicating that dirty reads are prevented; non-repeatable
reads and phantom reads can occur. This level only prohibits a
transaction from reading a row with uncommitted changes in it.</li>
  <li><span style="font-weight: bold;">TRANSACTION_REPEATABLE_READ</span>&nbsp;&nbsp;&nbsp;
A constant indicating that dirty reads and non-repeatable reads are
prevented; phantom reads can occur. This level prohibits a transaction
from reading a row with uncommitted changes in it, and it also
prohibits the situation where one transaction reads a row, a second
transaction alters the row, and the first transaction rereads the row,
getting different values the second time (a "non-repeatable read").</li>
  <li><span style="font-weight: bold;">TRANSACTION_SERIALIZABLE</span>&nbsp;&nbsp;&nbsp;
A constant indicating that dirty reads, non-repeatable reads and
phantom reads are prevented. This level includes the prohibitions in
TRANSACTION_REPEATABLE_READ and further prohibits the situation where
one transaction reads all rows that satisfy a WHERE condition, a second
transaction inserts a row that satisfies that WHERE condition, and the
first transaction rereads for the same condition, retrieving the
additional "phantom" row in the second read.</li>
</ol>
<br>
&#20197;&#19979;&#26159;&#25105;&#23545;&#36825;&#20960;&#20010;&#38548;&#31163;&#26497;&#21035;&#30340;&#32763;&#35793;&#65306;(&#25105;&#24819;&#22914;&#26524;&#26159;&#22235;&#24180;&#21046;&#26412;&#31185;&#30340;&#36719;&#20214;&#19987;&#19994;&#65292;&#22312;&#25968;&#25454;&#24211;&#35838;&#31243;&#20013;&#24212;&#35813;&#20250;&#25509;&#35302;&#21040;&#36825;&#20123;&#20869;&#23481;)<br>
<ol>
  <li><span style="font-weight: bold;">TRANSACTION_NONE&nbsp;</span>&nbsp;&nbsp;
&nbsp;&nbsp; &#27809;&#26377;&#20107;&#21153;&#25903;&#25345;&#65292;&#19981;&#21487;&#33021;&#29992;&#22312;&#30495;&#27491;&#30340;&#24212;&#29992;&#20013;<br>
  </li>
  <li><span style="font-weight: bold;">TRANSACTION_READ_UNCOMMITTED</span>&nbsp;&nbsp;&nbsp;
&#20801;&#35768;&#8220;&#33039;&#8221;&#35835;&#65292;&#19981;&#21487;&#20877;&#29616;&#37325;&#35835;&#21644;&#24433;&#23376;&#35835;&#65306;&#20855;&#20307;&#34920;&#29616;&#20026;&#65292;&#20801;&#35768;&#25968;&#25454;&#24211;&#30340;&#19968;&#34892;&#30001;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;A&#36827;&#34892;&#25913;&#21464;&#30340;&#21516;&#26102;&#65292;&#20801;&#35768;&#30001;&#21478;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;B&#35835;&#21462;&#36825;&#20010;&#34987;&#20107;&#21153;A&#25913;&#21464;&#21518;&#30340;&#21516;
&#19968;&#34892;&#65292;&#32780;&#27492;&#26102;&#20107;&#21153;A&#36824;&#27809;&#25552;&#20132;&#23427;&#30340;&#25913;&#21464;&#65292;&#22240;&#20026;&#25968;&#25454;&#27491;&#22788;&#22312;&#25913;&#21464;&#29366;&#24577;&#36824;&#26410;&#23558;&#25913;&#21464;&#25552;&#20132;&#21040;&#25968;&#25454;&#24211;&#20013;&#65288;&#26415;&#35821;&#8220;&#33039;&#8221;&#30340;&#26469;&#21382;&#65289;&#65292;&#22914;&#26524;&#20107;&#21153;&#21518;&#26469;&#21448;&#22238;&#28378;&#20102;&#23427;&#30340;&#25913;&#21464;&#65292;&#37027;&#20040;&#20107;&#21153;B
&#35835;&#21462;&#30340;&#20449;&#24687;&#23558;&#26159;&#26080;&#25928;&#30340;&#65292;&#32780;&#36825;&#26080;&#25928;&#21482;&#26377;&#31561;&#21040;&#20107;&#21153;B&#25552;&#20132;&#26102;&#25165;&#33021;&#23519;&#35273;&#21040;&#65288;&#20197;&#22833;&#36133;&#21578;&#32456;&#65289;&#12290;&#27492;&#26497;&#21035;&#25552;&#39640;&#20102;&#20107;&#21153;&#30340;&#24182;&#21457;&#24615;&#65292;&#20294;&#21516;&#26102;&#23548;&#33268;&#20102;&#26080;&#25928;&#30340;&#35835;&#22686;&#22810;&#12290;&#27492;&#26041;&#26696;&#22312;&#21482;&#35835;&#20107;&#21153;
&#21333;&#20803;&#26102;&#26377;&#29992;</li>
  <li><span style="font-weight: bold;">TRANSACTION_READ_COMMITTED</span>&nbsp;&nbsp;&nbsp;
&#27492;&#32423;&#21035;&#19981;&#20801;&#35768;&#8220;&#33039;&#35835;&#8221;&#65292;&#20294;&#26410;&#21487;&#20877;&#29616;&#37325;&#35835;&#21644;&#24433;&#23376;&#35835;&#36824;&#26159;&#20801;&#35768;&#30340;&#65292;&#27492;&#32423;&#21035;&#38459;&#27490;&#20102;&#35835;&#21462;&#26410;&#25552;&#20132;&#30340;&#25913;&#21464;&#12290;</li>
  <li><span style="font-weight: bold;">TRANSACTION_REPEATABLE_READ</span>&nbsp;&nbsp;&nbsp;
&#27492;&#32423;&#21035;&#19981;&#20801;&#35768;&#8220;&#33039;&#35835;&#8221;&#65292;&#20063;&#19981;&#20801;&#35768;&#19981;&#21487;&#20877;&#29616;&#30340;&#37325;&#35835;&#65292;&#20294;&#24433;&#23376;&#35835;&#36824;&#26159;&#20801;&#35768;&#30340;&#12290;&#25152;&#35859;&#30340;&#8220;&#19981;&#21487;&#20877;&#29616;&#30340;&#37325;&#35835;&#8221;&#20026;&#65306;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;A&#35835;&#21462;&#19968;&#34892;&#65292;&#32039;&#25509;&#30528;&#31532;&#20108;&#20010;&#20107;&#21153;&#21333;&#20803;B&#25913;&#21464;
&#20102;&#36825;&#34892;&#65292;&#20294;&#26410;&#25552;&#20132;&#26356;&#25913;&#65292;&#20107;&#21153;&#21333;&#20803;A&#20877;&#25509;&#25509;&#30528;&#35835;&#21462;&#36825;&#34892;&#65292;&#22914;&#26524;&#20801;&#35768;&#20107;&#21153;&#21333;&#20803;A&#20004;&#27425;&#35835;&#21462;&#30340;&#20869;&#23481;&#19981;&#21516;&#65292;&#21017;&#21483;&#20570;&#19981;&#21487;&#20877;&#29616;&#30340;&#37325;&#35835;&#65292;&#22914;&#26524;&#25968;&#25454;&#24211;&#20445;&#35777;&#20102;&#20102;&#20004;&#27425;&#35835;&#21462;&#30340;&#20869;&#23481;&#24517;
&#39035;&#30456;&#21516;&#65292;&#21017;&#20026;&#21487;&#20877;&#29616;&#37325;&#35835;&#12290;</li>
  <li><span style="font-weight: bold;">TRANSACTION_SERIALIZABLE</span>&nbsp;&nbsp;&nbsp;
&#27492;&#32423;&#21035;&#25351;&#31034;&#8220;&#33039;&#35835;&#8221;&#65292;&#19981;&#21487;&#20877;&#29616;&#37325;&#35835;&#21450;&#24433;&#23376;&#35835;&#37117;&#34987;&#31105;&#27490;&#12290;&#26412;&#32423;&#21035;&#38500;&#20102; TRANSACTION_REPEATABLE_READ
&#20013;&#30340;&#38480;&#21046;&#20043;&#22806;&#65292;&#36824;&#24471;&#28385;&#36275;&#26410;&#24433;&#23376;&#35835;&#12290;&#25152;&#35859;&#24433;&#23376;&#35835;&#20026;&#65306;&#22914;&#26524;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;A&#36890;&#36807; Where
&#26465;&#20214;&#38480;&#21046;&#20102;&#21462;&#22238;&#30340;&#32467;&#26524;&#38598;&#65292;&#32780;&#31532;&#20108;&#20107;&#21153;&#21333;&#20803;B&#25554;&#20837;&#20102;&#19968;&#34892;&#19988;&#36825;&#34892;&#28385;&#36275;Where
&#26465;&#20214;&#65292;&#20294;&#26410;&#25552;&#20132;&#26356;&#25913;&#65292;&#24403;&#20107;&#21153;&#21333;&#20803;A&#20877;&#27425;&#36890;&#36807;&#21516;&#26679;&#30340;&#26465;&#20214;&#36827;&#34892;&#26597;&#35810;&#26102;&#65292;&#22914;&#26524;&#21487;&#20197;&#33719;&#24471;&#21018;&#21018;&#30001;&#20107;&#21153;&#21333;&#20803;B&#25554;&#20837;&#30340;&#35760;&#24405;&#65292;&#21017;&#34920;&#31034;&#24433;&#23376;&#35835;&#65292;&#22914;&#26524;&#19981;&#21487;&#33021;&#33719;&#24471;&#21017;&#21483;&#31105;&#27490;&#24433;&#23376;&#35835;<br>
  </li>
</ol>
<br>
<h3><a name="7.2"></a>&#20107;&#21153;&#20256;&#25773;&#34892;&#20026;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
<br>
&#38500;&#20102;&#19978;&#38754;&#25105;&#20204;&#24050;&#32463;&#20171;&#32461;&#20102;&#30340;&#38548;&#31163;&#32423;&#21035;&#65292;&#21478;&#19968;&#20010;&#37325;&#35201;&#30340;&#27010;&#24565;&#21017;&#26159;&#20107;&#21153;&#20256;&#25773;&#34892;&#20026;(Propagation behavior)&#65306;<br>
<br>
<span style="font-style: italic;">Spring In Action:</span><br
 style="font-style: italic;">
<span style="font-style: italic;">&nbsp;Table 5.2 Spring&#8217;s
transactional propagation rules</span><br>
<br>
<ul>
  <li><span style="font-weight: bold;">PROPAGATION_MANDATORY</span>&nbsp;&nbsp;&nbsp;
Indicates that the method must run within a transaction. If no existing
transaction is in progress, an exception will be thrown.</li>
  <li><span style="font-weight: bold;">PROPAGATION_NESTED</span>&nbsp;&nbsp;
&nbsp; Indicates that the method should be run within a nested
transaction if an existing transaction is in progress. The nested
transaction can be committed and rolled back individually from the
enclosing transaction. If no enclosing transaction exists, behaves like
PROPAGATION_REQUIRED. Beware that vendor support for this propagation
behavior is spotty at best. Consult the documentation for your resource
manager to determine if nested transactions are supported.</li>
  <li><span style="font-weight: bold;">PROPAGATION_NEVER</span>&nbsp;&nbsp;&nbsp;
Indicates that the current method should not run within a transactional
context. If there is an existing transaction in progress, an exception
will be thrown. </li>
  <li><span style="font-weight: bold;">PROPAGATION_NOT_SUPPORTED</span>&nbsp;&nbsp;&nbsp;
Indicates that the method should not run within a transaction. If an
existing transaction is in progress, it will be suspended for the
duration of the method. If using JTATransactionManager, access to
TransactionManager is required.</li>
  <li><span style="font-weight: bold;">PROPAGATION_REQUIRED&nbsp;&nbsp;&nbsp;
    </span>Indicates that the current method must run within a
transaction. If an existing transaction is in progress, the method will
run within that transaction. Otherwise, a new transaction will be
started.</li>
  <li><span style="font-weight: bold;">PROPAGATION_REQUIRES_NEW</span>
Indicates that the current method must run within its own transaction.
A new transaction is started and if an existing transaction is in
progress, it will be suspended for the duration of the method. If using
JTATransactionManager, access to Transaction-Manager is required.</li>
  <li><span style="font-weight: bold;">PROPAGATION_SUPPORTS</span>&nbsp;&nbsp;&nbsp;
Indicates that the current method does not require a transactional
context, but may run within a transaction if one is already in progress.</li>
</ul>
<br>
<ul>
  <li><span style="font-weight: bold;">PROPAGATION_MANDATORY</span>&nbsp;&nbsp;&nbsp;
&#25351;&#31034;&#26041;&#27861;&#25191;&#34892;&#24517;&#39035;&#20855;&#26377;&#20107;&#21153;&#25903;&#25345;&#65292;&#21542;&#21017;&#24322;&#24120;&#23558;&#20250;&#25243;&#20986;&#12290;</li>
  <li><span style="font-weight: bold;">PROPAGATION_NESTED</span>&nbsp;&nbsp;
&nbsp;
&#25351;&#31034;&#22914;&#26524;&#24403;&#21069;&#24050;&#32463;&#23384;&#22312;&#19968;&#20010;&#20107;&#21153;&#65292;&#35813;&#26041;&#27861;&#23558;&#22312;&#33258;&#24049;&#30340;&#20107;&#21153;&#21333;&#20803;&#20013;&#25191;&#34892;&#65292;&#20294;&#35813;&#20107;&#21153;&#21333;&#20803;&#23558;&#23884;&#22871;&#22312;&#24050;&#23384;&#22312;&#30340;&#20107;&#21153;&#21333;&#20803;&#20043;&#20013;&#65292;&#32780;&#19988;&#36825;&#20010;&#20107;&#21153;&#21333;&#20803;&#21487;&#21333;&#29420;&#20110;&#22806;&#21253;&#30340;&#20107;&#21153;&#21333;&#20803;&#36827;
&#34892;&#25552;&#20132;&#12289;&#22238;&#28378;&#12290;&#22914;&#26524;&#27809;&#26377;&#20107;&#21153;&#21333;&#20803;&#23384;&#22312;&#65292;&#23427;&#30340;&#34892;&#20026;&#19982;PROPAGATION_REQUIRED&#19968;&#26679;&#65292;&#19968;&#20010;&#26032;&#30340;&#20107;&#21153;&#21333;&#20803;&#23558;&#34987;&#21021;&#22987;&#21270;&#20986;&#26469;&#12290;&#20294;&#26159;&#27599;&#20010;&#25968;&#25454;&#24211;&#21378;&#38388;&#23545;
&#36825;&#20010;&#20256;&#25773;&#34892;&#20026;&#30340;&#25903;&#25345;&#19981;&#22823;&#19968;&#26679;&#12290;&#35831;&#30041;&#24847;&#12290;</li>
  <li><span style="font-weight: bold;">PROPAGATION_NEVER</span>&nbsp;&nbsp;&nbsp;
&#25351;&#31034;&#26041;&#27861;&#19981;&#24212;&#36816;&#34892;&#22312;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#20013;&#65292;&#22914;&#26524;&#24050;&#32463;&#26377;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#23384;&#22312;&#20102;&#65292;&#23558;&#25243;&#20986;&#24322;&#24120;&#12290; </li>
  <li><span style="font-weight: bold;">PROPAGATION_NOT_SUPPORTED</span>&nbsp;&nbsp;&nbsp;
&#25351;&#31034;&#26041;&#27861;&#19981;&#24212;&#36816;&#34892;&#22312;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#20013;&#65292;&#20294;&#22914;&#26524;&#24050;&#32463;&#23384;&#20102;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#65292;&#22312;&#26041;&#27861;&#30340;&#25191;&#34892;&#36807;&#31243;&#20013;&#23558;&#20250;&#23558;&#20107;&#21153;&#21151;&#33021;&#25346;&#36215;&#12290;</li>
  <li><span style="font-weight: bold;">PROPAGATION_REQUIRED&nbsp;&nbsp;&nbsp;
    </span>&#25351;&#31034;&#26041;&#27861;&#24517;&#39035;&#36816;&#34892;&#22312;&#20107;&#21153;&#21333;&#20803;&#20013;&#65292;&#22914;&#26524;&#24050;&#32463;&#23384;&#20102;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#65292;&#21017;&#26041;&#27861;&#23558;&#21512;&#24182;&#21040;&#35813;&#20107;&#21153;&#21333;&#20803;&#20013;&#21435;&#65292;&#22914;&#26524;&#27809;&#26377;&#23384;&#22312;&#30340;&#20107;&#21153;&#21333;&#20803;&#65292;&#21017;&#23558;&#21019;&#24314;&#20986;&#19968;
&#20010;&#26032;&#30340;&#20107;&#21153;&#21333;&#20803;&#12290;</li>
  <li><span style="font-weight: bold;">PROPAGATION_REQUIRES_NEW</span>
&#25351;&#31034;&#27492;&#26041;&#27861;&#24517;&#39035;&#36816;&#34892;&#22312;&#33258;&#24049;&#30340;&#20107;&#21153;&#21333;&#20803;&#20013;&#65292;&#22914;&#26524;&#19968;&#20010;&#20107;&#21153;&#21333;&#20803;&#24050;&#32463;&#23384;&#22312;&#30340;&#35805;&#65292;&#19968;&#20010;&#26032;&#30340;&#20107;&#21153;&#21333;&#20803;&#23558;&#21019;&#24314;&#19988;&#21407;&#20808;&#23384;&#22312;&#30340;&#20107;&#21153;&#21333;&#20803;&#22312;&#36825;&#20010;&#26041;&#27861;&#30340;&#25191;&#34892;&#20854;&#38388;&#23558;&#34987;&#25346;&#36215;&#12290;</li>
  <li><span style="font-weight: bold;">PROPAGATION_SUPPORTS</span>&nbsp;&nbsp;&nbsp;
&#25351;&#31034;&#26041;&#27861;&#19981;&#24517;&#19968;&#23450;&#35201;&#36816;&#34892;&#22312;&#20107;&#21153;&#21333;&#20803;&#20013;&#65292;&#20294;&#26159;&#22914;&#26524;&#26377;&#24050;&#32463;&#23384;&#22312;&#30340;&#20107;&#21153;&#21333;&#20803;&#30340;&#35805;&#65292;&#23427;&#20063;&#20048;&#24847;&#22312;&#20107;&#21153;&#21333;&#20803;&#20013;&#36816;&#34892;&#12290;</li>
</ul>
<br>
<h3><a name="7.3"></a>&#21482;&#35835;&#25552;&#31034;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#27492;&#23646;&#24615;&#21482;&#23545; PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, and
PROPAGATION_NESTED&#12288;&#20256;&#25773;&#34892;&#20026;&#26377;&#24847;&#20041;&#65292;&#22240;&#20026;&#23545;&#20110;&#20854;&#23427;&#27809;&#26377;&#20107;&#21153;&#21333;&#20803;&#30340;&#20256;&#25773;&#34892;&#20026;&#26159;&#27809;&#26377;&#24517;&#35201;&#30340;&#12290;<br>
&#21482;&#35835;&#25552;&#31034;&#32473;&#20104;&#25968;&#25454;&#24211;&#26377;&#26426;&#20250;&#20316;&#20986;&#26356;&#22823;&#32966;&#30340;&#20248;&#21270;&#12290;<br>
&#22914;&#26524;&#26159;&#20351;&#29992; Hinbernate &#20316;&#20026; O/R maping &#30340;&#35805;&#65292;Hibernate &#21487;&#20197;&#20351;&#29992; FLUSH_NEVER
&#27169;&#24335;&#36991;&#20813;&#19981;&#24517;&#35201;&#30340;&#25968;&#25454;&#21516;&#27493;&#28040;&#32791;&#65292;&#22240;&#20026;&#26159;&#21561;&#35835;&#65292;&#25968;&#25454;&#21516;&#27493;&#26159;&#26681;&#26412;&#27809;&#26377;&#24517;&#35201;&#30340;&#12290;<br>
<br>
<br>
<h3><a name="7.4"></a>&#20107;&#21153;&#36229;&#26102;&#21608;&#26399;</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#23545;&#20110;&#38271;&#26102;&#38388;&#36816;&#34892;&#30340;&#20107;&#21153;&#25805;&#20316;&#65292;&#25105;&#20204;&#24517;&#38656;&#20272;&#35745;&#25805;&#20316;&#30340;&#26368;&#22351;&#24773;&#24418;&#65288;&#20063;&#23601;&#21487;&#33021;&#30340;&#26368;&#22823;&#36816;&#34892;&#26102;&#38388;&#65289;&#65292;&#30001;&#20110;&#20107;&#21153;&#20250;&#22823;&#37327;&#20351;&#29992;&#25968;&#25454;&#24211;&#38145;&#65292;&#23558;&#30456;&#20851;&#30340;&#25968;&#25454;&#24211;&#21015;&#65292;&#25110;&#25968;&#25454;&#24211;&#34892;&#25110;&#25972;&#20010;&#34920;
&#38145;&#20303;&#12290;&#38271;&#26102;&#38388;&#30340;&#38145;&#23558;&#20250;&#20351;&#25968;&#25454;&#24211;&#38271;&#26102;&#38388;&#19981;&#21487;&#29992;&#12290;&#22240;&#27492;&#25105;&#20204;&#24517;&#39035;&#20272;&#35745;&#26368;&#22351;&#30340;&#24773;&#24418;&#12290;&#36890;&#36807;&#35774;&#32622;&#36229;&#26102;&#26102;&#38388;&#65292;&#36229;&#36807;&#20102;&#36825;&#20010;&#26102;&#38388;&#65292;&#25972;&#20010;&#20107;&#21153;&#20250;&#22238;&#28378;&#12290;<br>
<br>
<br>
<br>
&#24324;&#25026;&#20102;&#19978;&#38754;&#36825;&#20123;&#37325;&#35201;&#30340;&#27010;&#24565;&#21518;&#65292;&#30475; Spring &#23545;&#20107;&#21153;&#30340;&#37197;&#32622;&#26159;&#30456;&#24403;&#30340;&#31616;&#21333;&#20102;&#65306;<br>
<span class="921372908-18012007">
<pre>    &lt;!--<br>        <span style="color: rgb(255, 0, 0);">&#20107;&#21153;&#26041;&#38024;&#22768;&#26126;&#65292;&#29992;&#20110;&#25511;&#21046;&#37319;&#29992;<big
 style="font-weight: bold;"><big>&#20160;&#20040;&#26679;</big></big>&#30340;&#20107;&#21153;&#31574;&#30053;</span><br>        Transaction advice definition, based on method name patterns.<br>        Defaults to PROPAGATION_REQUIRED for all methods whose name starts with<br>        "insert" or "update", and to PROPAGATION_REQUIRED with read-only hint<br>        for all other methods.<br>    --&gt;<br>    &lt;tx:advice id="txAdvice"&gt;<br>        &lt;tx:attributes&gt;<br>            &lt;tx:method name="insert*"/&gt;<br>            &lt;tx:method name="update*"/&gt;<br>            &lt;tx:method name="*" read-only="true"/&gt;<br>        &lt;/tx:attributes&gt;<br>    &lt;/tx:advice&gt;</pre>
</span><br>
1. &#39318;&#20808;&#23450;&#20041;&#20102; Advice &#65292;&#35813; advice &#34987; AOP&#20107;&#21153; &#25318;&#25130;&#26426;&#24341;&#29992;&#20102;<br>
2. &#20107;&#21153;&#30340;&#23646;&#24615;&#65292;&#20381;&#27425;&#21015;&#20986;&#20102;&#27599;&#20010;&#26041;&#27861;&#30340;&#21069;&#32512;&#65292;&#22914; insert* &#21017;&#20250;&#21305;&#37197;PetStoreFacade&#20013;&#30340; void
insertAccount(Account account);&nbsp; void insertOrder(Order order);&#65292;&#32780;
update* &#21017;&#20250;&#21305;&#37197; void updateAccount(Account account); &#65292;&#20854;&#23427;&#30340;&#65288;"*") &#37117;&#21482;&#26159;
get/search/select, &#21363;&#26159;&#21482;&#35835;&#26597;&#35810;&#20102;&#65292;&#25152;&#20197;&#20102;&#25351;&#23450;&#20102; read-only="true" &#23646;&#24615;.<br>
<br>
&#20320;&#21487;&#33021;&#20250;&#38382;&#65292;&#19978;&#38754;&#35848;&#20102;&#21322;&#22825;&#30340; isolation level &#21450; propagation behavior, &#24590;&#20040;&#36825;&#37324;&#26681;&#26412;&#27809;&#26377;&#20986;&#29616;&#12290;&#20854;&#23454;&#26159;
Spring &#20351;&#29992;&#20102;&#40664;&#35748;&#30340;&#20540;&#65306;<br>
<br>
&#22914;&#26524;&#27809;&#26377;&#25351;&#23450;&#38548;&#31163;&#32423;&#21035;&#65292;ISOLATION_DEFAULT &#23558;&#34987;&#40664;&#35748;&#25351;&#23450;<br>
&#22914;&#26524;&#27809;&#26377;&#25351;&#23450;&#20107;&#21153;&#20256;&#25773;&#34892;&#20026;&#65292;PROPAGATION_REQUIRED&#12288;&#23558;&#34987;&#25351;&#23450;<br>
<br>
&#25152;&#20197;&#19978;&#38754;&#30340;&#22768;&#26126;&#19982;&#19979;&#38754;&#30340;&#30340;&#19968;&#26679;&#30340;&#65306;<br>
<span class="921372908-18012007">
<pre>    &lt;tx:advice id="txAdvice"&gt;<br>        &lt;tx:attributes&gt;<br>            &lt;tx:method name="insert*" PROPAGATION_REQUIRED ISOLATION_DEFAULT /&gt;<br>            &lt;tx:method name="update*" PROPAGATION_REQUIRED ISOLATION_DEFAULT /&gt;<br>            &lt;tx:method name="*" PROPAGATION_REQUIRED ISOLATION_DEFAULT read-only="true" /&gt;<br>        &lt;/tx:attributes&gt;<br>    &lt;/tx:advice&gt;<br><br></pre>
</span><br>
&#21363;&#65306;<br>
1. &#25152;&#26377;&#20197; insert &#24320;&#22836;&#30340;&#26041;&#27861;&#37117;&#38656;&#35201;&#20107;&#21153;&#22788;&#29702; (PROPAGATION_REQUIRED&#65289;&#32780;&#38548;&#31163;&#32423;&#21035;&#37319;&#29992;&#24213;&#23618;&#25968;&#25454;&#20026;&#40664;&#35748;&#30340;&#32423;&#21035;<br>
2. &#25152;&#26377;&#20197; update &#24320;&#22836;&#30340;&#26041;&#27861;&#19982; insert &#30456;&#21516;<br>
3. &#20854;&#23427;&#26041;&#27861;&#38500;&#19982;&#19978;&#38754;&#30340;&#20107;&#21153;&#23646;&#24615;&#30456;&#21516;&#22806;&#65292;&#19988;&#20026; read-only <br>
<br>
<br>
<h2><a name="8"></a>Actions &#21450; struts-config.xml <br>
</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
Action &#26159;Struts &#30340;&#26680;&#24515;&#65292;&#26159;&#25511;&#21046;&#23618;&#32452;&#20214;&#30340;&#20851;&#38190;&#65292;&#26159;&#36890;&#24448;&#19994;&#21153;&#23618;/ DAO&#30340;&#23618;&#30340;&#36884;&#24452;&#12290;&#22312;&#39029;&#38754;&#19978;&#65292;&#27599;&#19968;&#20010;&#25353;&#38062;&#65292;&#36229;&#38142;&#25509;&#37117;&#26377;&#30456;&#24212;&#30340;
Action&#12288;&#26469;&#34920;&#31034;&#65292;&#22240;&#20026;&#27599;&#20010;&#36825;&#31181;&#39029;&#38754;&#20803;&#32032;&#37117;&#26159;&#29992;&#26469;&#20570;&#19968;&#28857;&#20107;&#24773;&#30340;&#12290;&#27604;&#22914;&#65306;&#25552;&#20132;&#19968;&#24352;&#29992;&#25143;&#20449;&#24687;&#34920;&#21333;&#65307;&#25191;&#34892;&#19968;&#27573;&#26381;&#21153;&#22120;&#30340;&#20195;&#30721;&#65292;&#27604;&#22914;&#65292;&#25353;&#19979;&#25628;&#32034;&#25353;&#38062;&#65292;&#23558;&#20174;&#25968;&#25454;&#24211;
&#20013;&#26597;&#20986;&#28385;&#36275;&#26465;&#20214;&#30340;&#20135;&#21697;&#35760;&#24405;&#12290;<br>
&#27599;&#20010;Action &#37117;&#24212;&#24403;&#20174; Struts &#30340; org.apache.struts.action.Action &#31867;&#27966;&#29983;&#19979;&#26469;&#65292;&#24182;
overriding &#20854;&#20013;&#30340;&#19968;&#20010; execute() &#26041;&#27861;&#65292;&#25152;&#26377;&#30340;&#21160;&#20316;&#65288;&#25353;&#19979;&#25353;&#38062;&#25110;&#28857;&#20987;&#38142;&#25509;&#21518;&#30340;&#21160;&#20316;&#65289;&#37117;&#24212;&#24403;&#22312;&#36825;&#20010;&#26041;&#27861;&#20013;&#23436;&#25104;&#12290;<br>
<br>
&#25105;&#20204;&#36825;&#37324;&#19981;&#21487;&#33021;&#25226;&#25152;&#26377;&#30340; Action &#37117;&#21015;&#20986;&#26469;&#65292;&#25152;&#20197;&#21482;&#25361;&#20960;&#20010;&#26377;&#20195;&#34920;&#30340;&#26469;&#20316;&#20171;&#32461;&#65292;&#26368;&#20027;&#35201;&#26159;&#29702;&#35299; Struts
&#26694;&#26550;&#30340;&#26426;&#29702;&#65292;&#24590;&#20040;&#20351;&#21508;&#20010;&#37096;&#20998;&#26377;&#26426;&#30340;&#32452;&#32455;&#22312;&#19968;&#36215;&#65292;&#36798;&#21040;&#31616;&#21270;&#24320;&#21457;&#27493;&#39588;&#30340;&#30446;&#30340;&#12290;<br>
<br>
<h3><a name="8.1"></a>BaseAction</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#25105;&#20204;&#24050;&#32463;&#22312;&#21069;&#38754;&#30340;&#31995;&#21015;&#20013;&#35814;&#32454;&#35762;&#36807;&#36825;&#20010;&#31867;&#65292;&#22914;&#26524;&#19981;&#35760;&#24471;&#23427;&#20570;&#20102;&#20160;&#20040;&#65292;&#22238;&#22836;&#30475;&#30475;&#28304;&#30721;&#65292;&#22914;&#26524;&#36824;&#19981;&#21313;&#20998;&#28165;&#26970;&#65292;&#21487;&#20197;&#20877;&#22238;&#22836;&#30475;&#30475;&#21069;&#38754;&#30340;&#31995;&#21015;&#12290;&#36825;&#20010; Action
&#26159;&#25105;&#20204;&#25152;&#26377;&#30495;&#27491;&#24037;&#20316;&#30340;&#65288;&#24102;&#26377; execute()&#26041;&#27861;&#30340;) Action&#30340;&#36229;&#31867;&#65292;&#25152;&#20197;&#36825;&#37324;&#19981;&#25171;&#31639;&#37325;&#22797;&#20102;&#12290;&#19981;&#36807;&#65292;&#20540;&#24471;&#20511;&#37492;&#30340;&#26159;&#65292;&#22914;&#26524;&#25152;&#26377;&#30340; Action
&#20013;&#37117;&#26377;&#30340;&#19996;&#35199;&#65292;&#37117;&#21487;&#20197;&#25552;&#21040;&#36825;&#20010;&#36229;&#31867;&#24403;&#20013;&#26469;&#12290;<br>
<br>
<h3><a name="8.2"></a>DoNothingAction</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#23545;&#20110;&#26377;&#20123; Action,
&#23427;&#20854;&#23454;&#24182;&#27809;&#28041;&#21450;&#21040;&#21830;&#19994;&#36923;&#36753;&#65292;&#21482;&#26159;&#20174;&#19968;&#20010;&#39029;&#38754;&#36339;&#21040;&#21478;&#19968;&#20010;&#39029;&#38754;&#65292;&#22240;&#20026;&#29978;&#33267;&#36830;&#26657;&#39564;&#29992;&#25143;&#36825;&#20010;&#21151;&#33021;&#37117;&#19981;&#38656;&#35201;&#65288;&#36825;&#26159;&#21487;&#33021;&#30340;&#65292;&#24403;&#20320;&#36827;&#20837;china-pub
&#26102;&#65292;&#22312;&#27809;&#26377;&#27880;&#20876;&#30340;&#24773;&#20917;&#19979;&#26159;&#23436;&#20840;&#21487;&#20197;&#27983;&#35272;&#22270;&#20070;&#30340;&#65289;&#12290;&#25152;&#20197;&#23384;&#22312;&#19968;&#20010;&#19982;&#21830;&#19994;&#36923;&#36753;&#26080;&#20851;&#30340; Action, &#21363; DoNothingAction,
&#25105;&#20204;&#30475;&#30475;&#23427;&#30340;&#20195;&#30721;&#65306;<br>
<br>
<span class="921372908-18012007">
<pre>public class DoNothingAction extends BaseAction {<br>  <br>  /* Public Methods */<br>  <br>  public ActionForward execute(ActionMapping mapping, ActionForm form,<br>          HttpServletRequest request, HttpServletResponse response) throws Exception {<br>    // &#26159;&#21542;&#26159;&#20174; Spring web &#36339;&#36807;&#26469;&#30340;<br>    if (request.getParameter("invalidate") != null<br>            &amp;&amp; request.getParameter("invalidate").toString().equals("true")) {<br>      // &#22914;&#26524;&#26159;&#65292;&#26080;&#25928; session<br>      request.getSession().invalidate();<br>    }<br>    <br><br>    <span
 style="color: rgb(255, 0, 0);">return mapping.findForward("success");</span><br>  }<br>}</pre>
</span><br>
&#20854;&#20013;&#65292;&#30495;&#27491;&#30340;&#20195;&#30721;&#23601;&#36825;&#19968;&#34892;&#65306;return mapping.findForward("success"); <br>
&#20854;&#23427;&#30340;&#26159;&#22240;&#20026;&#25105;&#20204;&#24037;&#31243;&#26159;&#26377;&#20004;&#22871;WEB&#26694;&#26550;&#26469;&#28436;&#31034;&#30340;&#65288;&#19968;&#20010;&#26159; Struts , &#19968;&#20010;&#26159; SpringMVC),
&#25152;&#20197;&#36825;&#37324;&#21028;&#26029;&#26159;&#21542;&#26159;&#20174;&#21478;&#19968;&#31181;&#23454;&#29616;&#20013;&#36339;&#36807;&#26469;&#30340;&#65292;&#22914;&#26524;&#26159;&#30340;&#35805;&#65292;&#20808;&#23558;&#30446;&#21069; session
&#20013;&#30340;&#23545;&#35937;&#26080;&#25928;&#65292;&#27604;&#22914;&#65306;&#24050;&#32463;&#30331;&#24405;&#30340;&#29992;&#25143;&#65292;&#24050;&#32463;&#25918;&#20837;&#21040;&#36141;&#29289;&#36710;&#30340;&#19996;&#35199;&#12290;&#22240;&#20026;&#20174;&#19968;&#31181;&#26694;&#26550;&#36339;&#21040;&#21478;&#19968;&#31181;&#26694;&#26550;&#65288;&#22312;&#39029;&#38754;&#30340;&#26368;&#19979;&#38754;&#65289;&#65292;&#21518;&#21488;&#30340;&#23454;&#29616;&#26159;&#19968;&#26679;&#30340;&#65292;&#21482;&#26159;WEB&#23618;&#19996;&#35199;
&#19981;&#19968;&#26679;&#65292;&#20294;&#20026;&#20102;&#28436;&#31034;&#30340;&#26694;&#26550;&#30340;&#25972;&#20010;&#29983;&#21629;&#21608;&#26399;&#65292;&#25152;&#20197;&#20174;&#19968;&#20010;&#23454;&#29616;&#36339;&#21040;&#19968;&#31181;&#23454;&#29616;&#37117;&#20250;&#8220;&#20174;&#22836;&#20877;&#26469;&#8221;&#12290;<br>
<br>
&#25152;&#20197;&#36825;&#20010;Action &#25152;&#35201;&#36827;&#34892;&#30340;&#21160;&#20316;&#23601;&#26159;&#65292;&#25214;&#21040;&#20320;&#35813;&#21435;&#30340;&#22320;&#26041;&#65288;success)&#65292;&#22914;&#26524;&#19981;&#20986;&#24847;&#22806;&#30340;&#35805;&#65292;&#36339;&#36807;&#21435;&#21543;&#12290;&#22312;
struts-config.xml &#25991;&#20214;&#20013;&#25628;&#32034;&#65288;Ctrl-f) "DoNothingAction"&#65292;&#25105;&#20204;&#21457;&#29616;&#19977;&#20010;&#22320;&#26041;&#24341;&#29992;&#20102;&#35813;&#31867;<br>
<br>
<span class="921372908-18012007">
<pre>&lt;!-- &#26080;&#35770;&#20309;&#26102;&#65292;&#35201;&#21435;&#39318;&#38754;&#26102; --&gt;<br>    &lt;action path="/shop/index" type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"<br>            validate="false"&gt;<br>      &lt;forward name="success" path="/WEB-INF/jsp/struts/index.jsp"/&gt;<br>    &lt;/action&gt;<br><br><span
 style="color: rgb(255, 0, 0);">&lt;!-- &#28857;&#20987;&#24110;&#21161;&#38142;&#25509;&#26102; --&gt;</span><br>    &lt;action path="/shop/help" type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"<br>            validate="false"&gt;<br>      &lt;forward name="success" path="/WEB-INF/jsp/struts/help.jsp"/&gt;<br>    &lt;/action&gt;<br><br><span
 style="color: rgb(255, 0, 0);">&lt;!-- &#28857;&#20987;&#27880;&#20876;&#25353;&#38062;&#65292;&#36827;&#20837;&#27880;&#20876;&#39029;&#38754; --&gt;</span><br>    &lt;action path="/shop/signonForm" type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"<br>            validate="false"&gt;<br>      &lt;forward name="success" path="/WEB-INF/jsp/struts/SignonForm.jsp"/&gt;<br>    &lt;/action&gt;<br></pre>
</span><br>
<h3><a name="8.3"></a>ActionForm &lt;-- struts-config.xml --&gt; Action</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
struts-config.xml &#25991;&#20214;&#26159;Struts &#26694;&#26550;&#23558;&#21508;&#37096;&#20998;&#26377;&#26426;&#22320;&#32452;&#32455;&#22312;&#19968;&#36215;&#30340;&#20851;&#38190;&#65292;&#21487;&#20197;&#25171;&#24320; struts-config.xml
&#25991;&#20214;&#30475;&#30475;&#65306;<br>
1. &#23427;&#22768;&#26126;&#20102;&#25152;&#26377;&#30340; form-bean (&#21363;&#27599;&#20010;&#36755;&#20837;&#34920;&#21333;&#23545;&#23601;&#30340; Java &#23545;&#35937;&#65292;&#29992;&#26469;&#25910;&#38598;&#29992;&#25143;&#25552;&#20132;&#30340;&#36755;&#20837;&#20449;&#24687;&#65289;&#65292;&#36825;&#20123; bean &#23558;&#34987;
&lt;action-mappings&gt; &#20013;&#30340; &lt;action&gt; &#30340; name &#23646;&#24615;&#24341;&#29992;<br>
2. &#23427;&#25351;&#23450;&#20102;&#20840;&#23616;&#36339;&#36716; (global forward),&nbsp; &#21487;&#20197;&#22312;Action &#30340; execute()
&#26041;&#27861;&#20013;&#24341;&#29992;&#65292;&#22914;&#65306;mapping.findForward("failure");<br>
3. &#23427;&#25351;&#23450;&#20102;&#25152;&#26377;&#30340; action-mapping, &#20174;&#36825;&#20010; mapping &#38598;&#21512;&#23601;&#21487;&#30693;&#25972;&#20010;&#24212;&#29992;&#30340;&#26469;&#40857;&#21435;&#33033;&#65292;&#22914;&#65306;<br>
<span class="921372908-18012007">
<pre>    &lt;action path="/shop/editAccount" type="org.springframework.samples.jpetstore.web.struts.EditAccountAction"<br>            name="workingAccountForm" scope="session" validate="true" input="/WEB-INF/jsp/struts/EditAccountForm.jsp"&gt;<br>      &lt;forward name="success" path="/shop/index.do"/&gt;<br>    &lt;/action&gt;</pre>
</span>1. path=<span style="font-weight: bold;">/shop/editAccount</span>&nbsp;
&#25152;&#26377;&#35201;&#21435;&#20303; /shop/editAccount &#65288;&#20005;&#26684;&#22320;&#35762;&#65292;&#22914;&#26524;&#25353;&#29031;Struts &#30340;&#26041;&#35328;&#26159; /shop/editAccount.do)
&#30340;&#35831;&#27714;&#65292;&#37117;&#35201;&#36981;&#24490;&#36825;&#37324;&#30340;&#37197;&#32622;<br>
<br>
2. <span style="font-weight: bold;">name="workingAccountForm"</span>
&#37117;&#23558;&#32465;&#23450; workingAccountForm &#65292;&#27880;&#24847; form-bean &#22312; Action &#20013;&#24341;&#29992;&#26159;&#36890;&#36807; name
&#23646;&#24615;&#26469;&#24341;&#29992;&#30340;&#65292;&#23427;&#26159;&#22312;&#19968;&#24320;&#22987;&#23450;&#20041;&#30340;: &lt;form-bean name="workingAccountForm"
type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/&gt;<br>
<br>
3. <span style="font-weight: bold;">scope="session"</span> &#35813; bean
&#23558;&#22312;&#25972;&#20010;&#20250;&#35805;&#20854;&#38388;&#22987;&#32456;&#26377;&#25928; &#65292;&#20294;&#27880;&#24847;&#36825;&#20010;&#37197;&#32622;&#26159;&#22810;&#20313;&#30340;&#65292;&#40664;&#35748;&#23601;&#26159; session &#19978;&#19979;&#25991;&#30340;&#65292;&#21453;&#32780;&#22914;&#26524; bean &#21482;&#22312; request
&#25991;&#26102;&#65292;&#25165;&#38656;&#35201;&#26126;&#30830;&#22320;&#22768;&#26126;&#12290;<br>
<br>
4. validate="true" &#23558;&#23545;&#34920;&#21333;&#30340;&#36755;&#20837;&#35843;&#29992; form-bean &#30340; validate &#26041;&#27861;&#12290;&#20294;&#25105;&#20204;&#21457;&#29616;&#22312;
AccountActionForm.java &#20013;&#65292;&#21482;&#26377; doValidate(...) &#26041;&#27861;&#65292;&#24182;&#27809;&#26377;
validate()&#26041;&#27861;&#65292;&#20294;&#32454;&#24515;&#30340;&#35805;&#65292;&#24212;&#35813;&#21457;&#29616;&#20102;&#65292;&#21644;&#25152;&#26377;&#30340;Action &#37117;&#26159;&#20174;BaseAction &#20013;&#27966;&#29983;&#32780;&#26469;&#19968;&#26679;&#65292;&#25152;&#26377;&#30340;
ActionForm &#20013;&#37117;&#26159;&#20174;&#19968;&#20010;&#22522;&#31867; BaseActionForm.java &#20013;&#27966;&#29983;&#19979;&#26469;&#12290;&#20854;&#20013;&#23450;&#20041;&#20102;&#25152;&#26377; formbean
&#37117;&#38656;&#35201;&#30340;&#19996;&#35199;&#65292;&#23545;&#20110;&#26657;&#39564;&#38169;&#35823;&#30340;&#22788;&#29702;&#12290;&#20854;&#20013;&#23601;&#26159; validate(...) &#26041;&#27861;&#65292;&#24182;&#22312;&#20854;&#20013;&#35843;&#29992;&#20102; doValidate() &#26041;&#27861;&#65292;&#32780;&#27599;&#20010;
BaseActionForm &#30340;&#23376;&#31867;&#21482;&#35201;override &#36825;&#20010; doValidate() &#26041;&#27861;&#65292;&#22914;&#26524; validate="true"
&#22768;&#26126;&#20102;&#30340;&#35805;&#65292;&#37027;&#20040;&#23376;&#31867;&#20013;&#30340; doValidate() &#26041;&#27861;&#23558;&#20250;&#34987;&#35843;&#29992;&#12290;&#36825;&#26159;&#22810;&#24577;&#24615;&#30340;&#34920;&#29616;&#12290;<br>
<br>
5. input="..."&nbsp; &#19968;&#33324;&#26469;&#35762;&#65292;&#19968;&#20010;&#34920;&#21333;&#22312;&#26657;&#39564;&#22833;&#36133;&#21518;&#37117;&#38656;&#35201;&#22238;&#21435;&#37325;&#32416;&#27491;&#38169;&#35823;&#30340;&#36755;&#20986;&#39033;&#65292;&#25152;&#20197;&#25105;&#20204;&#36890;&#36807;&#36825;&#20010;&#20540;&#26469;&#21578;&#35785; Struts
&#35813;&#22238;&#21040;&#21738;&#21435;&#32416;&#38169;<br>
<br>
<br>
<h3><a name="8.4"></a>SecureBaseAction</h3>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
SecureBaseAction &#26159;&#19968;&#20010;&#25277;&#35937;&#31867;&#65292;&#20294;&#23427;&#20063;&#26159;&#20174;BaseAction &#27966;&#29983;&#36807;&#26469;&#30340;&#65292;&#23427;&#30340;&#30446;&#30340;&#22312;&#25191;&#34892; execute &#26041;&#27861;&#20043;&#21069;&#39318;&#20808;&#35201;&#32463;&#36807;<span
 style="font-weight: bold;">&#26159;&#21542;&#30331;&#24405;</span>&#26816;&#26597;&#65292;&#22914;&#26524;&#27809;&#26377;&#21017;&#36339;&#21040;&#30331;&#24405;&#39029;&#38754;&#65292;&#24182;&#23558;&#24403;&#21069;&#35201;&#21435;&#24448;&#30340;&#39029;&#38754;&#35760;&#19979;&#26469;&#65292;&#31561;&#30331;&#24405;&#23436;
&#21518;&#65292;&#20877;&#36339;&#36716;&#36807;&#21435;&#12290;&#65288;&#32780;&#19981;&#35937;&#26377;&#20123;&#33756;&#40479;&#20570;&#30340;&#65292;&#25105;&#26412;&#26469;&#36873;&#25321;&#20102;&#21435;&#19979;&#36733;&#39029;&#38754;&#65292;&#20294;&#23427;&#39318;&#20808;&#35201;&#25105;&#30331;&#24405;&#65292;&#32780;&#30331;&#24405;&#21518;&#21364;&#25226;&#25105;&#24102;&#21040;&#20102;&#39318;&#39029;&#65292;&#32780;&#19981;&#26159;&#25105;&#35201;&#21435;&#30340;&#19979;&#36733;&#39029;&#38754;&#12290;&#27880;&#24847;&#22312;
execute() &#26041;&#27861;&#20013;&#35843;&#29992;&#29992;&#30340;&#26159;&#25277;&#35937;&#26041;&#27861; doExecute(...) &#65292;&#36825;&#20010;&#25277;&#35937;&#26041;&#27861;&#26159;&#31561;&#24453;&#27492;&#31867;&#30340;&#23376;&#31867;&#26469;&#23454;&#29616;&#30340;&#12290;&#36825;&#20063;&#26159;&#22810;&#24577;&#24615;&#30340;&#34920;&#29616;&#12290;<br>
<br>
<br>
<br>
<h2><a name="9"></a>DAO&#25509;&#21475;&#35774;&#35745;&#21450;Hibernate DAO &#23454;&#29616;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#35774;&#35745;&#26041;&#24335;&#26377;&#22909;&#22810;&#31181;&#65292;&#26377;&#20123;&#26159;&#20174;&#33258;&#24213;&#21521;&#19978;&#35774;&#35745;&#65292;&#26377;&#20123;&#21483;&#20570;&#33258;&#39030;&#21521;&#19979;&#35774;&#35745;&#12290;&#23545;&#20110; J2EE &#30340;&#39033;&#30446;&#33258;&#24213;&#21521;&#19978;&#35774;&#35745;&#20250;&#22909;&#20123;&#12290;<br>
&#23545;&#20110;DAO&#30340;&#35774;&#35745;&#65292;&#19968;&#33324;&#26469;&#35828;&#65292;&#27599;&#20010;DAO&#37117;&#20250;&#21253;&#21547;&#25152;&#26377;&#30340; CRUD(Create, Retrieve, Update,
Delete)&#65292;&#32780;&#19981;&#31649;&#39030;&#23618;&#65292;&#21363;&#34920;&#31034;&#23618;&#30446;&#21069;&#26159;&#21542;&#20250;&#20840;&#29992;&#21040;&#36825;&#20123;&#21151;&#33021;&#12290;&#22240;&#20026;&#36825;&#20123;&#22522;&#26412;&#21151;&#33021;&#26159;&#32452;&#25104;&#26356;&#22797;&#26434;&#25968;&#25454;&#25805;&#20316;&#30340;&#22522;&#30784;&#65292;&#20917;&#19988;&#30446;&#21069;&#34429;&#28982;&#27809;&#26377;&#29992;&#21040;&#65292;&#20294;&#35828;&#19981;&#23450;&#38543;&#30528;&#20135;&#21697;
&#30340;&#28436;&#21270;&#65292;&#19979;&#19968;&#29256;&#26412;&#23601;&#20250;&#29992;&#21040;&#12290;&#20917;&#19988;&#23454;&#29616;&#36825;&#20123; CRUD&#24182;&#19981;&#37027;&#20040;&#22256;&#38590;&#12290;&#20294;&#26159;&#25105;&#20204;&#30340;&#39033;&#30446;&#22909;&#35937;&#20599;&#20102;&#25042;&#65292;&#21482;&#26159;&#23450;&#20041;&#20986;&#19978;&#23618;&#38656;&#35201;&#30340;&#25152;&#26377;&#26041;&#27861;&#12290;&#36825;&#23545;&#20110;&#28436;&#31034;&#39033;&#30446;&#20063;&#26080;&#21487;&#21402;&#38750;&#12290;<br>
<br>
&#38500;&#20102;&#22522;&#26412;&#30340;CRUD&#65292;&#19968;&#33324;&#20026;&#20102;&#36866;&#24212;&#19978;&#23618;&#30340;&#38656;&#27714;&#65292;&#37117;&#38656;&#35201;&#25552;&#21462;&#20986;&#30456;&#24212;&#30340;&#26041;&#27861;&#26469;&#28385;&#36275;&#38656;&#27714;&#30340;&#21160;&#35789;&#12290;&#22914;&#65306;&#21015;&#20986;&#28385;&#36275;&#26465;&#20214;&#30340;&#25152;&#26377;&#20135;&#21697;&#65292;&#37027;&#20040;&#22312; ProductDao
&#20013;&#21017;&#26377;&#65306;<br>
<br>
<span class="921372908-18012007">
<pre>List searchProductList(String keywords) throws DataAccessException;</pre>
</span><br>
&#25105;&#20204;&#19981;&#25226;&#20027;&#35201;&#31934;&#21147;&#25918;&#22312;DAO&#25509;&#21475;&#30340;&#35774;&#35745;&#19978;&#65292;&#22240;&#20026;&#36825;&#20027;&#35201;&#26159;&#35774;&#35745;&#24072;&#30340;&#36131;&#20219;&#65288;&#25110;&#35768;&#23545;&#20110;&#23567;&#20844;&#21496;&#32780;&#35328;&#65292;&#20063;&#26159;&#31243;&#24207;&#21592;&#30340;&#36131;&#20219;&#65292;&#22914;&#26524;&#26159;&#36825;&#26679;&#30340;&#35805;&#65292;&#19968;&#23450;&#35201;&#25235;&#20303;&#26426;&#20250;&#65281;&#65289;&#12290;&#25105;&#20204;
&#20027;&#35201;&#30475;&#30475;&#22522;&#20110; Spring &#30340; HibernateSupport &#30340; Dao &#30340;&#23454;&#29616;&#12290;<br>
<br>
&#22914;&#26524;&#20102;&#35299;SQL&#35821;&#35328;&#65292;&#20854;&#23454;&#26159;&#24456;&#31616;&#21333;&#30340;&#65292;&#20294;&#22914;&#26524;&#19981;&#20102;&#35299;&#30340;&#35805;&#65292;&#21035;&#26080;&#36873;&#25321;&#65292;&#33267;&#23569;&#24471;&#35835;&#19968;&#26412;SQL&#26041;&#38754;&#30340;&#20070;&#65292;&#22914;&#26524;&#24819;&#25104;&#20026;&#19968;&#21517;&#24320;&#21457;&#32773;&#30340;&#35805;&#65292;&#24403;&#28982;&#22312;&#31532;&#19968;&#20221;&#24037;&#20316;&#26102;&#21487;&#20197;&#19981;&#24517;
&#25285;&#24515;&#65292;&#22914;&#26524;&#20320;&#25954;&#20110;&#20882;&#38505;&#30340;&#35805;&#65281;&#26159;&#19981;&#26159;&#65292;&#33391;&#23376;&#65311;<br>
<br>
&#25688;&#33258;HibernateCategoryDao.java<br>
<span class="921372908-18012007">
<pre>public class HibernateCategoryDao extends <span
 style="color: rgb(51, 102, 255);"><span
 style="color: rgb(51, 51, 255);">HibernateDaoSupport</span> </span>implements CategoryDao {<br>  <br>  <br>  public List getCategoryList() throws DataAccessException {<br>    // todo: now not retrive id<br>    return <span
 style="color: rgb(51, 51, 255);">getHibernateTemplate().find</span>(<br>            "<span
 style="color: rgb(255, 0, 0);">from Category</span>");<br>  }<br>  <br>  /**<br>   * todo: pp, renamed categoryId to categoryName<br>   */<br>  public Category getCategory(String categoryName) throws DataAccessException {<br>    Category category = null;<br>    <br>    List ls = <span
 style="color: rgb(51, 51, 255);">getHibernateTemplate().find</span>(<br>            "<span
 style="color: rgb(255, 0, 0);">from Category cat where cat.categoryName = ?", categoryName</span>);<br>    <br>    if (ls != null &amp;&amp; ls.size() &gt; 0) {<br>      category =  (Category) ls.get(0);<br>    }<br>    <br>    return category;<br>  }<br>}</pre>
</span><br>
&nbsp;<span style="color: rgb(51, 51, 255);">&#34013;</span>&#33394;&#30340;&#26159;&#35843;&#29992;&#30340; Spring &#30340;
HibernateDaoSupport &#30340;api<br>
&nbsp;
<span style="color: rgb(255, 0, 0);">&#32418;</span>&#33394;&#30340;&#21017;&#26159; HQL (<span
 style="font-weight: bold;">H</span>ibernate <span
 style="font-weight: bold;">Q</span>uery <span
 style="font-weight: bold;">L</span>anguage) , SQL &#30340;&#21464;&#20307;<br>
<br>
1. &#35201;&#20174;&#34920; Category &#36873;&#20986;&#25152;&#26377;&#35760;&#24405;&#65292;<span style="font-family: monospace;">form
Category</span> &#23601;&#36825;&#20040;&#31616;&#21333;&#65292;&#20854;&#30456;&#24403;&#20110; <span style="font-family: monospace;">select
* from category</span>;<br>
<br>
2. &#22914;&#26524;&#35201;&#35774;&#32622;&#26597;&#35810;&#26465;&#20214;&#65292;&#23601;&#35937;&#31532;&#20108;&#20010;&#26041;&#27861;&#20013;&#37027;&#26679;&#20570;&#12290;<br>
<br>
3. &#22914;&#26524; api &#36820;&#22238;&#30340;&#26159;&#19968;&#20010;&#32467;&#26524;&#38598;&#65292;&#37027;&#20040;&#23427;&#21363;&#26159; List, &#26377;&#20102;&#36825;&#20010;&#32467;&#26524;&#38598;&#65292;&#25105;&#20204;&#23601;&#21487;&#20197;&#29992;&#25105;&#20204;&#24050;&#29087;&#24713;&#30340;&#26041;&#24335;&#22788;&#29702;&#23427;&#20102;&#12290;JSTL
&#30340;for-each&#65292;&#26222;&#36890;&#30340;iterator &#38543;&#20320;&#24590;&#20040;&#29992;&#12290;&#20540;&#24471;&#19968;&#25552;&#30340;&#26159;&#65292;Spring &#20869;&#32622;&#25903;&#25345;&#31616;&#21333;&#30340;&#20998;&#39029;&#21151;&#33021;&#12290;&#22312;&#25105;&#20204;&#30340;&#22909;&#20960;&#20010; Action
&#37117;&#29992;&#21040;&#20102;&#12290;&#22914;&#65306;<br>
<br>
&#20998;&#39029;&#26174;&#31034;&#20135;&#21697;&#39033;&#21015;&#34920;&#65292;&#27599;&#39029;&#26174;&#31034;4&#39033;&#65306;<br>
<span class="921372908-18012007">
<pre>      PagedListHolder itemList = new PagedListHolder(getPetStore().<br>              getItemListByProduct(productNumber));<br>      itemList.setPageSize(4);</pre>
</span><br>
<br>
4. &#22914;&#26524;&#25105;&#19981;&#24819;&#36820;&#22238;&#34920;&#30340;&#25152;&#26377;&#21015;&#65292;&#37027;&#20040;&#23601;&#26126;&#30830;&#22320;&#20889; select &#23376;&#21477;&#65288;&#21069;&#25105;&#20204;&#37117;&#30465;&#21435;&#20102;&#23427;&#65289;<br>
<br>
&#25688;&#33258; HibernateProductDao.java<br>
<span class="921372908-18012007">
<pre>getHibernateTemplate().find(<br>            "<span
 style="color: rgb(255, 0, 0);">select p , c.categoryName</span> " +<br>            "from Product p, Category c " +<br>            "where c.id = <span
 style="color: rgb(0, 102, 0);">p.category.id</span> and p.productNumber = ?", productNumber);</pre>
</span>&#20540;&#24471;&#25552;&#21450;&#30340;&#26159;&#65292;&#25105;&#20204;&#30475;&#21040;&#65288;&#32511;&#33394;&#30340;&#23383;&#65289;&#25105;&#20204;&#21487;&#20197;&#32423;&#32852;&#23548;&#33322;&#65288;&#22810;&#23618;&#35775;&#38382;&#65292;&#36890;&#36807;&#28857;"."),&nbsp; p.category.id
&#20854;&#23454;&#26159;&#20174;Product&#34920;&#23548;&#33322;&#21040;&#20102;Category &#34920;&#65292;&#20877;&#35775;&#38382; id &#21015;&#30340;&#12290;<br>
<br>
&#19978;&#38754;&#25105;&#20204;&#30475;&#21040;&#30340;&#37117;&#26159;&#26597;&#35810;&#65292;&#25105;&#20204;&#30475;&#30475;&#20854;&#23427;&#25805;&#20316;&#65306;<br>
<br>
5. &#25554;&#20837;<br>
&#25688;&#33258;HibernateOrderDao.java<br>
<span class="921372908-18012007">
<pre>getHibernateTemplate().persist(order);</pre>
</span>&#22914;&#26524;&#26144;&#23556;&#19968;&#20999;&#27491;&#24120;&#65292;&#22312;&#36825;&#20010;&#36141;&#29289;&#21333;&#19978;&#30340;&#25152;&#26377;&#39033;&#65288;LineItem&#65289;&#37117;&#23558;&#34987;&#25345;&#20037;&#21270;&#12290;&#36824;&#35760;&#24471; cascade="save-update"
&#21527;&#65311;&#25105;&#20204;&#33457;&#37027;&#20040;&#22823;&#21147;&#27668;&#65292;&#20026;&#24471;&#23601;&#26159;&#27492;&#26102;&#30340;&#36825;&#20040;&#31616;&#21333;&#12290;<br>
<br>
<br>
6. &#26356;&#26032;<br>
&#25688;&#33258;&#12288;HibernateAccountDao.java<br>
<span class="921372908-18012007">
<pre>getHibernateTemplate().update(account, LockMode.UPGRADE);</pre>
</span><br>
7. &#21024;&#38500;<br>
&#34429;&#28982;&#25105;&#20204;&#30340;&#20195;&#30721;&#20013;&#27809;&#26377;&#21024;&#38500;&#21151;&#33021;&#65292;&#20294;&#27491;&#22914;&#20320;&#29468;&#21040;&#30340;&#65292;&#22914;&#19979;&#65306;<br>
<span class="921372908-18012007">
<pre>getHibernateTemplate().delete(abcObject);</pre>
</span><br>
8. &#22312;IDE&#20013;&#65292;&#23558;&#40736;&#26631;&#25351;&#38024;&#25918;&#22312; <span style="font-family: monospace;">getHibernateTemplate().
</span>&#28608;&#27963;&#33258;&#21160;&#23436;&#25104;&#65292;&#30475;&#21040;&#30340;&#26041;&#27861;&#24212;&#35813;&#21487;&#20197;&#23436;&#25104;&#22823;&#37096;&#20998;&#26222;&#36890;&#30340;&#25968;&#25454;&#25805;&#20316;&#65292;&#22914;&#26524;&#20320;&#33021;&#29992;SQL&#36731;&#26494;&#23454;&#29616;&#30340;&#35805;&#65292;&#24212;&#35813;&#23601;&#20250;&#22312;&#36825;&#37324;&#25214;&#21040;&#23545;&#24212;&#30340;&#26041;&#27861;&#12290;<br>
<br>
<br>
&#26368;&#21518;&#65292;&#20320;&#21487;&#33021;&#20250;&#38382;&#65292;&#25105;&#20204;&#26144;&#23556;&#20102;&#37027;&#20040;&#22810; domain &#23545;&#35937;&#65292;&#20026;&#20160;&#20040;&#36825;&#26102;&#21482;&#26377;&#20116;&#20010;DAO&#21602;&#65311;<br>
&#25105;&#20204;&#27809;&#26377;&#24517;&#35201;&#23545;&#27599;&#20010; domain
&#23545;&#35937;&#37117;&#25552;&#20379;&#19968;&#20010;DAO&#30340;&#65292;&#29305;&#21035;&#26159;&#22312;&#20851;&#31995;&#24314;&#31435;&#30340;&#27604;&#36739;&#22909;&#30340;&#25968;&#25454;&#24211;&#26102;&#12290;&#22240;&#20851;&#31995;&#30340;&#23384;&#22312;&#65292;&#20877;&#21152;&#26144;&#23556;&#27491;&#30830;&#22320;&#24314;&#31435;&#36215;&#26469;&#20102;&#65292;&#20174;&#19968;&#20010;&#34920;&#23548;&#33322;&#21040;&#21478;&#19968;&#20010;&#34920;&#65292;&#27492;&#26102;&#21482;&#22312; java
&#20195;&#30721;&#25110; HQL &#20013;&#34920;&#29616;&#20986;&#26469;&#65306;<br>
<span class="921372908-18012007">
<pre>getHibernateTemplate().find(<br>            "select inv.quantity from <span
 style="color: rgb(204, 0, 0);">Inventory inv</span> where " +<br>            "inv.item.itemName = ?", itemName);</pre>
</span>&#34429;&#28982;&#27492;&#35821;&#21477;&#22312; HibernateItemDAO &#20013;&#65292;&#20294;&#26159;&#23427;&#29992;&#21040;&#20102; Item &#19982; Inventory &#20043;&#38388;&#30340;&#20851;&#31995;&#12290;<br>
<br>
&#19968;&#33324;&#25353;&#29031;&#36825;&#20010;&#27861;&#21017;&#65292;domain &#26159;&#32454;&#31890;&#24230;&#30340;&#23545;&#35937; &lt;&nbsp; Dao &#26159;&#20013;&#31561;&#31890;&#24230;&#30340;&#23545;&#35937;&nbsp; &lt; Facade
&#38376;&#38754;&#26159;&#31895;&#31890;&#24230;&#30340;&#23545;&#35937;<br>
<br>
<br>
<h2><a name="10"></a>&#24635;&#32467;</h2>
<div style="text-align: right;"><a
 href="Hibernate%20Jpetstore%20%D6%AE%C8%FD%20%BF%D8%D6%C6%B2%E3%C9%E8%BC%C6.html#1"><small>&#22238;
&#21040;&#39030;&#31471;</small></a><br>
</div>
<br>
&#25511;&#21046;&#23618;&#25216;&#26415;&#25110;&#26694;&#26550;&#26412;&#36523;&#23601;&#26159;&#20026;&#20102;&#31616;&#21270;&#24320;&#21457;&#32780;&#24320;&#21457;&#30340;&#65292;&#25152;&#20197;&#23427;&#19981;&#21487;&#33021;&#22826;&#22797;&#26434;&#30340;&#12290;<br>
&#36890;&#36807;&#20197;&#19978;&#30340;&#20171;&#32461;&#65292;&#25105;&#24076;&#26395;&#20320;&#20204;&#33021;&#24863;&#21463;&#21040;&#65292;&#21069;&#20004;&#20010;&#31995;&#21015;&#30340;&#22256;&#24785;&#27491;&#22312;&#24930;&#24930;&#25171;&#24320;&#12290;<br>
&#31561;&#21040;&#19979;&#19968;&#20010;&#31995;&#21015;&#65292;&#34920;&#31034;&#23618;&#25216;&#26415;&#30340;&#20171;&#32461;&#26102;&#65292;&#25105;&#24076;&#26395;&#20320;&#20204;&#21457;&#20986;&#65306;&#21407;&#26469;&#22914;&#27492;&#65281;&#30340;&#24863;&#21497;&#12290;&#22240;&#20026;&#21482;&#26377;&#34920;&#31034;&#23618;&#25165;&#26159;&#30452;&#35266;&#30340;&#12289;&#20146;&#30524;&#30446;&#30585;&#30340;&#65281;&#21040;&#37027;&#26102;&#20320;&#20250;&#26126;&#30333;&#20026;&#20160;&#20040;&#22312;&#25968;&#25454;&#23618;&#38656;&#22312;&#26576;&#20010;
domain &#20013;&#37027;&#20040;&#23450;&#20041;&#25104;&#21592;&#65292;&#22312; Dao &#20013;&#20026;&#20160;&#20040;&#38656;&#35201;&#23450;&#20041;&#36825;&#20010;&#26041;&#27861;&#65292;&#32780;&#19988;&#36820;&#22238;&#20026; List &#31867;&#22411;&#12290;&#22312; &#25511;&#21046;&#23618;&#20026;&#20160;&#20040;&#35201;&#23450;&#20041;&#26576;&#26576; Action.<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
